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

OpenGL:glAccum错误1282(无效操作),opengl,buffer,accumulate,Opengl,Buffer,Accumulate,编辑:添加了一些错误检查代码,发现执行glAccum时抛出错误“1282” Edit2:我在另一台计算机上尝试过完全相同的代码,它在那里工作得非常好 Edit3:“解决方案”ATI HD4xxx及以上卡不再支持累积缓冲区:* 因此,它不能在64位HD4850和最新驱动程序的Windows 7上运行 它可以在Windows 7 32位和Intel series 4 IGP上工作。GL累积红色位=16。 我还在一台基于Linux的机器上很快地试用了它,我不知道它的具体规格,它在那里也很有效。所以我想

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

Edit2:我在另一台计算机上尝试过完全相同的代码,它在那里工作得非常好

Edit3:“解决方案”ATI HD4xxx及以上卡不再支持累积缓冲区:*

因此,它不能在64位HD4850和最新驱动程序的Windows 7上运行 它可以在Windows 7 32位和Intel series 4 IGP上工作。GL累积红色位=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();
}
因此,累积缓冲区应该是可用的

我的显示方法如下所示:

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,这应该会影响到每个帧都画得非常“薄”,我的英语词汇让我留在这里。但这似乎没有任何影响。然后我将glAccumGL_RETURN,1.0改为gl_AccumGL_RETURN,0.0001;这也没什么作用,但应该让整个输出画面变薄

我已经按照DOF和抖动下的所有步骤从这里开始:我找不到我丢失的任何东西。有人有什么建议吗


顺便说一句,我是在装有Radeaon HD4850 GPU的Windows 7计算机上执行此操作的。

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


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

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

该错误为GLU INVALID_操作,如果没有累积缓冲区,或在glBegin和glEnd之间调用glAccum,则返回该操作。您是在glutInitDisplayMode后检查错误还是清除累积缓冲区?嘿,Jackson Pope,我已经检查了多个位置的错误:glutInitDisplayMode后:无错误,glClearGL_ACCUM_buffer_位:无错误,GLACUMGL_ACCUM后,weigth:错误1282。我的代码中没有glBegin或glEnd调用,DrawScene所做的只是调用glutSolidSphere。。几次。你能用软件光栅器复制吗?我怎样才能得到一个累积缓冲区?我不应该做比GLUTINITDISPLAYMODE GLUT|U DOUBLE | GLUT|RGB | GLUT|U ACCUM | GLUT|U DEPTH;正当我将累积缓冲区纯粹用于学校项目,对于现实世界的程序,我确实会使用浮点纹理。@Roy这是使用GLUT的方法,但您的GL实现可能不提供具有累积缓冲区的像素缓冲区,这意味着它不支持它们。我正在更新我的驱动程序,但它是ATI/AMD HD4850,因此如果ATI驱动程序是实现,那么我想它应该存在。好的,我更新了我的驱动程序,并使用OpenGL Extension Viewer 3.0进行了双重检查,我的驱动程序支持高达64位的累积缓冲区。好的,我终于找到了确凿的证据,证明至少有ATI的HD4xxx系列和更高版本不再支持累积缓冲区。嘿,datenwolf,感谢您对着色器中DOF的良好解释。我知道这种方法,不幸的是,这是一个小练习,我必须使用积累
Te累加缓冲区仅很少受到当代驱动程序的支持。使用帧缓冲区对象并使用加法混合函数或加法着色器组合渲染装备过程如何?例如,在我的系统上,驱动程序中最后一个具有累积缓冲功能的消费级GPU是GeForce3。只有专业级GPU仍然具有广泛的累积缓冲支持。顺便说一句:如果设置了ACCUM_BUFFER_位,glClear不会出错,因为位掩码定义了应该清除哪些可用平面;如果那架飞机不在,那就是一个角落。