2011-06-28 23 views
2

我需要計算每個像素的兩個深度紋理的平均值。我希望我可以用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

回答

0

正如我添加到我的問題,問題的根源不是深度紋理或混合模式,而只是我渲染到每個顏色分量8位的緩衝區。如果我爲了獲得更高精度的顏色緩衝區,它可能會工作。但我選擇使用一個片段程序,將輸出放在gl_FragDepth中,而且這看起來可以按需要工作,因爲我已經有了一個24位深度緩衝區。

2

GPU在float中進行所有計算。檢查您的CPU參考是否也使用float而不是double

+0

不,我沒有使用雙打。無論如何,如果它是一個浮動與雙重的問題,你不希望看到在第六個或第七個小數位的差異,而不是第三個? – JWWalker

+0

如果紋理值範圍是0-255,那麼第六個數字是0.002。 – shoosh

+0

我不明白爲什麼紋理值的範圍是0-255。當我創建紋理對象時,我將'GL_DEPTH_COMPONENT'傳遞給'format'和'internalFormat'參數,並且OpenGL Profiler將內部格式顯示爲'GL_DEPTH_COMPONENT24'。也許有趣的事情發生時,深度紋理被解釋爲亮度? – JWWalker