2013-10-03 57 views
4

這似乎是很難找到有關如何獲取連續渲染通道的着色器深度和模板緩存信息。訪問深度模板紋理

在第一渲染過程,我不只是渲染顏色和深度信息,而且還利用模板操作的計算對象。我爲此使用了多渲染目標FBO,並附加了顏色緩衝區和組合深度模板緩衝區。所有這些都是紋理的形式(不涉及渲染緩衝區對象)。

在第二次渲染過程中(當渲染到屏幕時),我想以每像素爲基礎訪問之前計算出的模板索引(但不一定是我繪製的像素),類似於你喜歡訪問先前渲染的顏色緩衝區以應用某些後期處理效果。

但我不能在第二遍深度模板紋理綁定到我的着色器程序的統一。至少只有黑色值被讀取,所以我猜測它沒有正確綁定。

  • 是否可以將深度模板紋理綁定到紋理單元以用於着色器程序?使用「普通」採樣器訪問深度和模板紋理是不可能的?有些「特殊」採樣器可能嗎?它取決於在紋理上設置的插值模式還是類似的設置?

  • 如果沒有,什麼是最好的(最快)的方法的模板信息複製到一個單獨的顏色紋理這兩個渲染層之間?也許涉及第三渲染過程其中提請使用模板測試單一顏色(I只需要在最後一個二進制版本模板緩衝區的渲染過程,要精確我需要測試,如果值爲零)。

用於紋理的設置正在使用的中間FBO如下:

// The textures for color information (GL_COLOR_ATTACHMENT*): 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
// The texture for depth and stencil information (GL_DEPTH_STENCIL_ATTACHMENT*): 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0); 

在第二渲染過程,我目前只嘗試「調試」的所有紋理的內容。因此,我安裝了着色器使用這些值:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, <texture>); 
glUniform1i(texLocation, 0); 

,並讓着色器程序簡單紋理複製到屏幕上:

uniform sampler2D tex; 
in vec2 texCoord; 
out vec4 fragColor; 

void main() { 
    fragColor = texture2D(tex, texCoord); 
} 

的結果如下:

  • 當上面的<texture>指的是我的一種顏色紋理,我看到在第一次渲染過程中呈現的顏色輸出,這正是我期望的。

  • 當上面的<texture>指的是深度模板紋理時,着色器沒有做任何事情(我看到了我用來清除屏幕的顏色)。

  • 將深度模板紋理複製到CPU並檢查它時,我會在預期的打包24 + 8位數據中看到深度和模板信息。

回答

2

我使用模板作爲紋理沒有經驗,但你可能想看看下面的擴展:

http://www.opengl.org/registry/specs/ARB/stencil_texturing.txt

另一種選擇可能是要創建的視圖質地使用

http://www.opengl.org/registry/specs/ARB/texture_view.txt

或者你可以指望對象,而模板緩衝,也許全光照摹地鐵和添加劑調合使用第二渲染目標:

http://www.opengl.org/registry/specs/EXT/draw_buffers2.txt

但我怕這些選項中不包括純GL3.3 ...

+0

感謝您指出我的延長!我GOOGLE了它,導致我這個討論:http://stackoverflow.com/a/13171346/592323。因此,如果我不想使用擴展名,似乎我提到的第二種方法是最好的。由於我只需要單一測試的結果,這是一個好方法。但也許有更快的方法,如深度模板24 + 8位緩衝區和ARGB顏色32位緩衝區之間的原始複製(然後我只是讀取藍色組件)。我不確定這是否可能... – leemes

+0

您的選擇非常依賴於您定位的GL版本。哪一個 ? – rotoglup

+0

我嘗試在我的應用程序中支持3.3版本,因此不希望使用任何只有3.3版本的系統上不可用的奇特擴展。但我通常對解決問題的方式感興趣。我目前通過額外的「模板複製」紋理解決了這個問題,在該紋理中,我啓用了模板測試來繪製一個屏幕對齊的四邊形。當然,這只是可能的,因爲我只對布爾表達式感興趣。如果我在着色器中使用模板緩衝區的數值,這當然不是解決方案。 – leemes