如何通过混合计算2个深度纹理的平均值



我需要计算每个像素处两个深度纹理的平均值。我希望使用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位的准确性。

所以现在我需要想办法在不损失准确性的情况下提取结果。也许是一个设置gl_FragDepth的片段着色器?

GPU在float中执行所有计算。检查您的CPU引用是否也使用float而不是double

正如我在问题中补充的那样,问题的根源不是深度纹理或混合模式,而是我正在渲染到每个颜色分量有8位的缓冲区中。如果我尽力获得更高精度的颜色缓冲区,它可能会起作用。但我选择了使用一个片段程序的替代方案,该程序将输出放入gl_FragDepth中,这似乎可以按需工作,因为我已经有了一个24位的深度缓冲区。

最新更新