我需要計算每個像素的兩個深度紋理的平均值。我希望我可以用GLSL片段着色器來做到這一點,但我更喜歡能夠在最笨的硬件上工作的解決方案,所以我嘗試了混合。這裏的主要代碼:如何通過混合來計算2個深度紋理的平均值?
/// 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);
的問題是,我得到的值是關閉了約0.002,與我所得到通過獲取兩個紋理的像素和計算CPU的平均水平。當在OpenGL Profiler(這是在Mac OS X 10.6.8)中設置斷點並且眼球顏色緩衝區時,它看起來像我期望的。混合模式中是否存在固有的不準確性?
我也嘗試將當前顏色設置爲0.5,0.5,0.5和使用glBlendFunc(GL_ONE, GL_ONE)
,並且錯誤方向相反,但大小相同。回想起來,我清楚地看到了我的錯誤:如果我渲染到每個顏色分量爲8位的渲染緩衝區,然後從其中一個組件中讀取像素,那麼我只有8位精度。
所以現在我需要找出一種方法來提取結果而不會失去準確性。也許一個片段着色器設置gl_FragDepth
?
不,我沒有使用雙打。無論如何,如果它是一個浮動與雙重的問題,你不希望看到在第六個或第七個小數位的差異,而不是第三個? – JWWalker
如果紋理值範圍是0-255,那麼第六個數字是0.002。 – shoosh
我不明白爲什麼紋理值的範圍是0-255。當我創建紋理對象時,我將'GL_DEPTH_COMPONENT'傳遞給'format'和'internalFormat'參數,並且OpenGL Profiler將內部格式顯示爲'GL_DEPTH_COMPONENT24'。也許有趣的事情發生時,深度紋理被解釋爲亮度? – JWWalker