2015-12-02 46 views
2

我正在做一個layered rendering到使用OpenGL 4.3的屏幕外FBO。我使用了GL_TEXTURE_3D作爲COLOR附件的幾個圖層。然後,我使用幾何着色器在編寫輸出時索引到不同的圖層。它工作正常。現在我還需要模板附件,用於在渲染過程中執行的模板測試。首先,我嘗試僅附加一個渲染緩衝區,就像使用2D附件一樣。GL_TEXTURE_3D顏色和模板FBO附件

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, 
GL_RENDERBUFFER, _stencilBuffer) 

在這種情況下,檢查FBO當用於完整性我正在幀緩衝器錯誤:

GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB

然後我假定如果顏色附件是3D所以模版附件也必須3D.And因爲沒有3D渲染緩衝區,我嘗試爲FBO的深度模板插槽添加3D紋理。

glTexImage3D(GL_TEXTURE_3D, 0, GL_DEPTH24_STENCIL8, width, height, depth, 
0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); 

寬度 - 紋理的寬度,高度 - 紋理的高度,深度 -number紋理3D內部層。

//Attach to FBO: 

glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, texId, 0)); 

這樣做,這樣我得到:

GL_FRAMEBUFFER_INCOMPLETE

INVALID_OPERATION

我已搜查任何可能的例子找到這樣的設置應該怎麼做,但一無所獲。 I also tried to use GL_TEXTURE_2D_ARRAY instead,but same problem.(由於某種原因,這實際上固定其堅持我以前的測試問題)

UPDATE

我的錯誤並不在debug.Basically一半是我上面寫的我的一些調查結果糊塗了可以被丟棄。但因爲其他人可能會遇到同樣的問題,我會解釋發生了什麼。

起初,當我附上一個3D紋理FBO的附色我創建了一個渲染緩衝GL_DEPTH_STENCIL attachment.And是,在完整性檢查我:

GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 

接下來,我想代替:

glTexImage3D(GL_TEXTURE_3D, 0, GL_DEPTH24_STENCIL8, width, height, depth, 
0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); 

其拋出:

INVALID_OPERATION

現在,而不是GL_TEXTURE_3D目標我想GL_TEXTURE_2D_ARRAY這最終導致了FBO是complete.So,而我還是想知道爲什麼GL_TEXTURE_3D原因INVALID_OPERATION(隨意張貼的答案),這種變化已經解決了這個問題。

+0

你可以發佈你從glCheckFramebufferStatus獲得的實際數字代碼嗎? –

+0

@NicolBolas Oh Man!你回來了!我們想念你了:) –

回答

3

基於規範,GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS裝置(引述的OpenGL 4.5規範):

If any framebuffer attachment is layered, all populated attachments must be layered. Additionally, all populated color attachments must be from textures of the same target (three-dimensional, one- or two-dimensional array, cube map, or cube map array textures).

基於對這個第一部分,您的使用單層模版附着具有分層3D紋理顏色的最初的嘗試依戀顯然是非法的。

第二部分聽起來有點不清楚。由於它只談及「彩色附件」,因此暗示使用GL_TEXTURE_3D彩色附件和GL_TEXTURE_2D_ARRAY模板附件是合法的。但我不相信這實際上是這個意圖。不幸的是,在規格的其餘部分我找不到其他的確認。

使用GL_TEXTURE_3D作爲模板或深度/模板紋理是非啓動器。沒有3D模板紋理這樣的東西。從4.5規範,191-192節「8.5紋理圖像規格」

Textures with a base internal format of DEPTH_COMPONENT, DEPTH_STENCIL, or STENCIL_INDEX are supported by texture image specification commands only if target is TEXTURE_1D, TEXTURE_2D, TEXTURE_2D_MULTISAMPLE, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_2D_MULTISAMPLE_ARRAY, TEXTURE_RECTANGLE, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY, PROXY_TEXTURE_1D, PROXY_TEXTURE_2D, PROXY_TEXTURE_2D_MULTISAMPLE, PROXY_TEXTURE_1D_ARRAY, PROXY_TEXTURE_2D_ARRAY, PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY, PROXY_TEXTURE_RECTANGLE, PROXY_TEXTURE_CUBE_MAP, or PROXY_TEXTURE_CUBE_MAP_ARRAY.

這是一個長長的名單,但TEXTURE_3D網頁是不是在裏面。

基於此,我相信你發現工作是唯一的選擇。您需要針對顏色和模板附件使用目標GL_TEXTURE_2D_ARRAY的紋理。