我需要计算每个像素的两个深度纹理的平均值。我希望我能用GLSL片段着色器做到这一点,但我更喜欢一种适用于最愚蠢的硬件的解决方案,所以我尝试了混合。这是主要代码:
/// Initialize color buffer to black
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT );
// Turn off unnecessary operations
glDisable( GL_DEPTH_TEST );
glDisable( GL_LIGHTING );
glDisable( GL_CULL_FACE );
glDisable( GL_BLEND );
glDisable( GL_STENCIL_TEST );
glDisable( GL_DITHER );
// Set all matrices to identity
glMatrixMode( GL_TEXTURE );
glLoadIdentity();
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
RenderAQuadTexturedWith( texture1 );
glEnable( GL_BLEND );
glBlendEquation( GL_FUNC_ADD );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glColor4f( 1.0f, 1.0f, 1.0f, 0.5f );
RenderAQuadTexturedWith( texture2 );
问题在于,与获得两个纹理的像素并计算CPU上的平均值相比,我获得的值大约为0.002。当在OpenGL Profiler中设置一个断点(这是在Mac OS X 10.6.8上)并且对颜色缓冲区进行眼球时,它看起来就像我期望的那样。混合模式中是否存在一些固有的不准确性?
我还尝试将当前颜色设置为0.5,0.5,0.5并使用glBlendFunc( GL_ONE, GL_ONE )
,错误的方向相反但大小相同。
编辑添加:回想起来,我清楚地看到了我的错误:如果我渲染到每个颜色分量为8位的渲染缓冲区,然后从其中一个组件读取像素,那么我只有8位精度。 / p>
所以现在我需要找到一种方法来提取结果而不会失去准确性。也许片段着色器设置gl_FragDepth
?
答案 0 :(得分:2)
GPU在float
中执行所有计算。检查您的CPU引用是否也在使用float
而不是double
。
答案 1 :(得分:0)
正如我在问题中添加的那样,问题的根源不是深度纹理或混合模式,而是我正在渲染到每个颜色分量为8位的缓冲区。如果我不顾一切地获得更高精度的颜色缓冲区,它可能会工作。但我选择使用片段程序将输出放在gl_FragDepth
中,这似乎可以正常工作,因为我已经有了24位深度缓冲区。