Opengl 使用GLFW的累积缓冲区

Opengl 使用GLFW的累积缓冲区,opengl,buffer,glfw,Opengl,Buffer,Glfw,我必须在openGL项目(DOF渲染)中使用累积缓冲区,但它似乎不能与GLFW库一起工作。 我在一个圆上正确移动相机,拍摄21张“快照”(10张在左边,1张在正常位置,10张在右边),将所有快照添加到累积缓冲区(乘以1/21),当我在“正常”位置时,我显示缓冲区。但是,图像只是静止的、未渲染的,但渲染速度比以前慢21倍。 主回路是: int _tmain(int argc, _TCHAR* argv[]) { // GLFW initialisation if (!gl

我必须在openGL项目(DOF渲染)中使用累积缓冲区,但它似乎不能与GLFW库一起工作。 我在一个圆上正确移动相机,拍摄21张“快照”(10张在左边,1张在正常位置,10张在右边),将所有快照添加到累积缓冲区(乘以1/21),当我在“正常”位置时,我显示缓冲区。但是,图像只是静止的、未渲染的,但渲染速度比以前慢21倍。 主回路是:

    int _tmain(int argc, _TCHAR* argv[]) {

    // GLFW initialisation
    if (!glfwInit()) {
        return -1;
    }
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE);
    glfwWindowHint(GLFW_SAMPLES, 16);
    GLFWwindow* window;
    window = glfwCreateWindow( 800, 600, "DOF", NULL, NULL);
    if ( !window ) {
        glfwTerminate();
        return -1;
    }   
    glfwMakeContextCurrent(window);

    // check for errors
    GLenum err = glGetError(); 
    if( err ) {
        fprintf( stderr, "ERROR: %s\n", glewGetErrorString( err ) );
        exit(EXIT_FAILURE);
    }

    // GLEW init
    glewExperimental = GL_TRUE;
    GLenum GlewInitResult;
    GlewInitResult = glewInit();
    if (GLEW_OK != GlewInitResult) {
        fprintf( stderr, "ERROR: %s\n", glewGetErrorString(GlewInitResult));
        exit(EXIT_FAILURE);
    }

    // main loop
    Game game;
    game.Init();
    Keyboard::KeyboardInit();
    glEnable(GL_DEPTH_TEST);
    glClear(GL_ACCUM_BUFFER_BIT);
    while (!glfwWindowShouldClose(window))
    {
        glAccum(GL_ACCUM, 1 / (game.getSteps() * 2 + 1)); // steps = 10
        game.nextStep(); //increments step by one
        game.Update();
        game.Redraw();
        if (game.getStep() == 1) {
            glAccum(GL_RETURN, 1);
            glfwSwapBuffers(window);
        }

        glfwPollEvents();

        calcFPS(2.0, "DOF", window);
    }

    glfwTerminate();

    return 0;
}

请注意,累积缓冲区是过去的东西,在大多数具有现代OpenGL配置文件的消费卡上不会被加速;它更有可能得到专业等级卡的支持

无论如何,您必须请求一个累积缓冲区才能获得一个。但是,您需要一个OpenGL-3.3核心概要文件,这为您提供了比累积缓冲区更好的东西:帧缓冲区对象。这些都得到了广泛的支持(如果使用FBO扩展,甚至可以追溯到2000年以前的非常旧的硬件),并允许更大的灵活性

通常的做法是:

  • 将场景渲染为纹理
  • 使用
    glBlendFunc(GL_SRC_ALPHA,GL_ONE)
    混合到具有HDR格式(GL_RGB16或类似格式)且ALPHA值为1/n,n为累积步数的累积纹理中绘制此纹理
  • 通常会为此创建两个单独的FBO。伪码

    for step in DOF:
        glBindFramebuffer(scenedraw_FBO)
        draw_scene()
    
        glBindFramebuffer(accumulation_FBO)
        glBindTexture(…, scenedraw_texture)
        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE)
        glColor4f(1.,1.,1., 1./(float)count(DOF) )
        draw_fullscreen_textured_quad()
        glBindTexture(…, 0)
    

    除了使用alpha值进行缩放,还可以使用浮点纹理格式并使用
    glBlendFunc(GL\u ONE,GL\u ONE)
    混合。但是,浮动纹理没有得到广泛支持。

    请注意,累积缓冲区是过去的东西,在大多数具有现代OpenGL配置文件的消费卡上不会加速;它更有可能得到专业等级卡的支持

    无论如何,您必须请求一个累积缓冲区才能获得一个。但是,您需要一个OpenGL-3.3核心概要文件,这为您提供了比累积缓冲区更好的东西:帧缓冲区对象。这些都得到了广泛的支持(如果使用FBO扩展,甚至可以追溯到2000年以前的非常旧的硬件),并允许更大的灵活性

    通常的做法是:

  • 将场景渲染为纹理
  • 使用
    glBlendFunc(GL_SRC_ALPHA,GL_ONE)
    混合到具有HDR格式(GL_RGB16或类似格式)且ALPHA值为1/n,n为累积步数的累积纹理中绘制此纹理
  • 通常会为此创建两个单独的FBO。伪码

    for step in DOF:
        glBindFramebuffer(scenedraw_FBO)
        draw_scene()
    
        glBindFramebuffer(accumulation_FBO)
        glBindTexture(…, scenedraw_texture)
        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE)
        glColor4f(1.,1.,1., 1./(float)count(DOF) )
        draw_fullscreen_textured_quad()
        glBindTexture(…, 0)
    

    除了使用alpha值进行缩放,还可以使用浮点纹理格式并使用
    glBlendFunc(GL\u ONE,GL\u ONE)
    混合。但是,浮动纹理没有得到广泛支持。

    请注意,累积缓冲区是过去的东西,在大多数具有现代OpenGL配置文件的消费卡上不会加速;它更有可能得到专业等级卡的支持

    无论如何,您必须请求一个累积缓冲区才能获得一个。但是,您需要一个OpenGL-3.3核心概要文件,这为您提供了比累积缓冲区更好的东西:帧缓冲区对象。这些都得到了广泛的支持(如果使用FBO扩展,甚至可以追溯到2000年以前的非常旧的硬件),并允许更大的灵活性

    通常的做法是:

  • 将场景渲染为纹理
  • 使用
    glBlendFunc(GL_SRC_ALPHA,GL_ONE)
    混合到具有HDR格式(GL_RGB16或类似格式)且ALPHA值为1/n,n为累积步数的累积纹理中绘制此纹理
  • 通常会为此创建两个单独的FBO。伪码

    for step in DOF:
        glBindFramebuffer(scenedraw_FBO)
        draw_scene()
    
        glBindFramebuffer(accumulation_FBO)
        glBindTexture(…, scenedraw_texture)
        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE)
        glColor4f(1.,1.,1., 1./(float)count(DOF) )
        draw_fullscreen_textured_quad()
        glBindTexture(…, 0)
    

    除了使用alpha值进行缩放,还可以使用浮点纹理格式并使用
    glBlendFunc(GL\u ONE,GL\u ONE)
    混合。但是,浮动纹理没有得到广泛支持。

    请注意,累积缓冲区是过去的东西,在大多数具有现代OpenGL配置文件的消费卡上不会加速;它更有可能得到专业等级卡的支持

    无论如何,您必须请求一个累积缓冲区才能获得一个。但是,您需要一个OpenGL-3.3核心概要文件,这为您提供了比累积缓冲区更好的东西:帧缓冲区对象。这些都得到了广泛的支持(如果使用FBO扩展,甚至可以追溯到2000年以前的非常旧的硬件),并允许更大的灵活性

    通常的做法是:

  • 将场景渲染为纹理
  • 使用
    glBlendFunc(GL_SRC_ALPHA,GL_ONE)
    混合到具有HDR格式(GL_RGB16或类似格式)且ALPHA值为1/n,n为累积步数的累积纹理中绘制此纹理
  • 通常会为此创建两个单独的FBO。伪码

    for step in DOF:
        glBindFramebuffer(scenedraw_FBO)
        draw_scene()
    
        glBindFramebuffer(accumulation_FBO)
        glBindTexture(…, scenedraw_texture)
        glEnable(GL_BLEND)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE)
        glColor4f(1.,1.,1., 1./(float)count(DOF) )
        draw_fullscreen_textured_quad()
        glBindTexture(…, 0)
    

    除了使用alpha值进行缩放,还可以使用浮点纹理格式并使用
    glBlendFunc(GL\u ONE,GL\u ONE)
    混合。不过,浮动纹理并没有得到广泛支持。

    您确实忽略了在像素格式中请求任何累积缓冲位。尽管这很可能无关紧要,因为如果枚举所有像素格式,在某些平台上,累积缓冲区总是非零的。这里真正重要的是您有一个核心配置文件,它不支持累积缓冲区。大概你能做的最好的事情就是使用你目前使用的16x MSAA(顺便说一下,很多GPU都不支持它)来存储7个左图像,1个中间图像和7个右图像。你确实忽略了以像素格式请求任何累积缓冲位。尽管这很可能无关紧要,因为如果枚举所有像素格式,在某些平台上,累积缓冲区总是非零的。这里真正重要的是您有一个核心配置文件,它不支持累积缓冲区。关于最好的你