编辑:添加了一些错误检查代码,并在执行glAccum(..)时发现抛出错误'1282‘。
Edit2:我在另一台计算机上尝试了完全相同的代码,它在那里运行得很好。
Edit3:'Solution‘ATI HD4xxx和UP卡不再支持累积缓冲区:*(
所以它不适用于64位的Windows764位HD4850和最新的驱动程序,它可以工作在32位的Windows7IGP英特尔系列4IGP。(GL_ACCUM_RED_BITS = 16)。我还在一台基于Linux的机器上非常非常快地尝试了它,我不知道它的确切规格,它也在那里工作。所以我猜这真的和我电脑里的某些东西有关:我不知道是什么,所以欢迎任何建议。
这是最初的问题。
我尝试使用glAccum来生成自由度效果,但是对glAccum的调用似乎没有任何效果。我已经将问题简化为一个简单的测试用例,在for循环中,我沿着x轴平移一些球体。正如您所看到的,当我尝试将颜色缓冲区数据复制到累积缓冲区时,报告了一个错误。
此外,当我检查累加缓冲器中可用的红色位的数量时,结果为0。这意味着它没有初始化吗?!
我将显示模式设置如下:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ACCUM | GLUT_DEPTH);
glClearAccum(0.0, 0.0, 0.0, 0.0);
因此,累积缓冲区应该是可用的。
我的display方法如下所示:
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,0.0001)更改为gl_Accum(GL_RETURN,0.0001);这同样没有做任何事情(但应该会使整个输出图片更细。
从这里开始,我遵循了自由度和抖动下的所有步骤:http://glprogramming.com/red/chapter10.html和我找不到我遗漏的任何东西。有谁有什么建议吗?
(顺便说一句,我是在一台装有Radeaon HD4850图形处理器的Windows7电脑上这样做的)。
发布于 2011-03-04 01:14:58
如果GL_ACCUM_RED_BITS是零,这意味着你没有累加缓冲区,你的GL实现应该至少在软件上支持它。glAccum处的错误还表明不存在累积缓冲区。
为什么你首先要使用累积缓冲区呢?您可以使用着色器、帧缓冲区对象和浮点纹理来实现相同的效果,而且它也与现代的OpenGL实现兼容。
发布于 2011-03-04 02:49:23
您可能没有累积缓冲区。但无论如何你都不需要一个。景深效果现在使用着色器完成。累积缓冲区方法需要多次渲染相同的图片;效率不是很高。着色器景深是一种后处理效果,它使用Z缓冲区值来选择模糊内核的大小。这个想法是收集当前片段周围的值,并通过Z值确定的模糊核大小添加每个相邻片段。为了保持内部循环较小,您通常以几个内核大小模糊整个图像,并将这些图像放入3D纹理的层中。然后,此3D纹理用于快速获取所需的模糊强度。
https://stackoverflow.com/questions/5183179
复制相似问题