OpenGL:glAccum错误1282(无效操作)

时间:2011-03-03 15:58:55

标签: opengl buffer accumulate

编辑:添加了一些错误检查代码,发现当我做glAccum(..)

时会抛出错误'1282'

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

Edit3:'解决方案'ATI HD4xxx和up卡不再支持累积缓冲区了:*(

因此它不适用于带有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 * appertureSamples)。

为了测试glAccum是否正在做任何事情,我已经将weigth变量更改为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计算机上这样做。)

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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