2016-05-12 155 views
0

我試圖執行一些程序並使用這個經典代碼:是否可以渲染3D紋理深度緩衝OpenGL中

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 

綁定深度緩衝。

glGenRenderbuffers(1, &depthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, 
height); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuffer); 

綁定幾個3D紋理:

glGenTextures(targets.size(), textures); 
for (auto &target : targets) { 
    glBindTexture(GL_TEXTURE_3D, textures[ix]); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32F, width, height, depth, 0, GL_RGBA, GL_FLOAT, NULL); 
} 
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + ix, textures[ix], 0); 
    buffers[ix] = GL_COLOR_ATTACHMENT0 + ix; 
    ++ix; 
} 
glDrawBuffers(targets.size(), buffers); 

而且它不工作,這表明GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS錯誤。我認爲,因爲我的紋理是分層的,所以沒有分層深度緩衝區可能會有問題。我用與3D紋理相同的方式創建了它,所以我刪除了深度緩衝區。這個解決的任務,現在我的幀緩衝區正在工作,渲染完成等。

但是如果我需要渲染每個圖層並附加了深度緩衝區,該怎麼辦?是否支持這種功能,是否有一些很少API調用來實現這一點?

回答

1

如果一個附加圖像是分層的,那麼所有附加的圖像必須分層。所以如果你想用深度緩衝區進行分層渲染,深度圖像必須也是分層。

因此,不應使用渲染緩衝區,而應使用深度格式的二維數組紋理。

+0

我不相信有深度格式的3D紋理。所以它必須是二維數組紋理。 –

+0

@ReetoKoradi:在OpenGL API中沒有限制。 –

+0

有點太長,以至於不能完整引用此處,但請檢查4.5規範的第191頁上的最後一段,從「基本內部格式爲DEPTH_COMPONENT的紋理...」開始。 –