编辑:添加了一些错误检查代码,发现当我做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计算机上这样做。)
答案 0 :(得分:0)
如果GL_ACCUM_RED_BITS为零,则表示您没有累积缓冲区,您的GL实现应该至少在软件中支持它。 glAccum的错误表明还没有存在累积缓冲区。
为什么你首先使用累积缓冲区?您可以使用着色器,帧缓冲对象和浮点纹理执行相同的效果,并且它还与现代OpenGL实现兼容。
答案 1 :(得分:0)
您可能没有累积缓冲区。但你无论如何都不需要。现在使用着色器完成景深效果。累积缓冲区方法需要多次渲染相同的图片;效率不高。着色器景深是一种后处理效果,它使用Z缓冲区值来选择模糊内核的大小。我们的想法是收集当前片段周围的值,并通过由Z值确定的模糊内核大小添加每个邻居片段。为了保持内环较小,通常会将整个图像模糊为几个内核大小,并将它们放入3D纹理的图层中。然后,此3D纹理用于快速获取所需的模糊强度。