0

编辑:添加了一些错误检查代码,发现当我执行 glAccum(..) 时会抛出错误“1282”

Edit2:我在另一台计算机上尝试了完全相同的代码,它在那里完美运行。

Edit3:“解决方案”ATI HD4xxx 及更高版本的卡不再支持累积缓冲区:*(

因此,它不适用于具有 HD4850 和最新驱动程序的 Windows 7 64 位 它确实适用于具有 Intel 系列 4 IGP 的 Windows 7 32 位。(GL_ACCUM_RED_BITS = 16)。我还在一台我不知道确切规格的基于 Linux 的机器上非常快速地尝试了它,它也在那里工作。所以我想这确实与我电脑中的某些东西有关:(。虽然我不知道是什么,所以欢迎任何提示。

这是原始问题。

我正在尝试使用 glAccum 来生成 DOF 效果,但是对 glAccum 的调用似乎没有任何效果。我已将问题简化为一个简单的测试用例,在 for 循环中我沿 x 轴平移一些球体。如您所见,当我尝试将颜色缓冲区数据复制到累积缓冲区时会报告错误。

此外,当我检查累积缓冲区中可用的红色位数时,结果为 0。这意味着它没有初始化?!

我已经设置了这样的显示模式:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ACCUM | GLUT_DEPTH);
glClearAccum(0.0, 0.0, 0.0, 0.0);

所以积累缓冲区应该是可用的。

我的显示方法如下所示:

void display(void)
{
    int i;
    GLint test[1];
    float weigth = 1.0/(float)apertureSamples;

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);

    HandleKeyboardInput();
    glLoadIdentity();
    UpdateCamera();

    glClear(GL_ACCUM_BUFFER_BIT);
glGetIntegerv(GL_ACCUM_RED_BITS, test);

    //No errors here but the number of red bits is 0!?
    for(i = 0; i < apertureSamples; i++)
    {       
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
        glPushMatrix();
        glTranslatef(10*i, 0, 0);
        DrawScene(); //draw a couple of spheres
        glPopMatrix();
            //Still no errors here
        glAccum(GL_ACCUM, weigth);
            //If I check for errors here I get error 1282
        glFlush();
    }
    glAccum(GL_RETURN, 1.0);

    glutSwapBuffers();
}

我现在希望看到球体的模糊轨迹,向右移动,但我没有,相反,我只看到 forloop 的最后一次迭代(所有球体在 x 轴上平移 10*apertureSamples)。

为了测试 glAccum 是否在做任何事情,我将 weight 变量更改为 0.00001,这应该会影响每一帧都被绘制得非常“薄”(我的英语词汇留在这里)。但这似乎没有任何影响。然后我将 glAccum(GL_RETURN, 1.0) 更改为 gl_Accum(GL_RETURN, 0.0001); 这又什么也没做(但应该使整个输出图片更薄。

我已经按照 DOF 和 JITTER 下的所有步骤从这里开始:http: //glprogramming.com/red/chapter10.html我找不到任何我遗漏的东西。有人有任何提示吗?

(顺便说一句,我正在使用 Radeaon HD4850 GPU 的 Windows 7 计算机上执行此操作)。

4

2 回答 2

0

如果 GL_ACCUM_RED_BITS 为零,则意味着您没有累积缓冲区,您的 GL 实现至少在软件中应该支持它。glAccum 的错误还表明不存在累积缓冲区。

你为什么首先使用累积缓冲区?您可以使用着色器、帧缓冲区对象和浮点纹理来实现相同的效果,并且它还与现代 OpenGL 实现兼容。

于 2011-03-03T17:14:57.907 回答
0

您可能没有累积缓冲区。但无论如何你都不需要。现在使用着色器完成景深效果。累积缓冲法需要多次渲染同一张图片;效率不高。着色器景深是一种后处理效果,它使用 Z 缓冲区值来选择模糊内核的大小。这个想法是收集当前片段周围的值,并通过由 Z 值确定的模糊内核大小添加每个相邻片段。为了使内部循环保持较小,您通常会在几个内核大小处模糊整个图像,并将它们放入 3D 纹理的层中。然后这个 3D 纹理用于快速获取所需的模糊强度。

于 2011-03-03T18:49:23.350 回答