编辑:添加了一些错误检查代码,发现当我执行 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 计算机上执行此操作)。