2011-08-26 109 views
22

我已經看到了很多關於這個主題的資料,但是我發現的例子和我很難理解正確的過程有一些差異。希望有人能告訴我,如果我在正確的軌道上。我還應該提到我在OS X Snow Leopard和Xcode 3的最新版本上這樣做。設置OpenGL多個渲染目標

爲了舉例,假設我要寫入兩個目標,一個用於正常,一個用於顏色。要做到這一點,我創建一個幀緩衝和綁定兩個紋理它,以及一個深度紋理:

glGenFramebuffersEXT(1, &mFBO); 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); 

glGenTextures(1, &mTexColor); 
glBindTexture(GL_TEXTURE_2D, mTexColor); 
//<texture params> 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexColor, 0); 

glGenTextures(1, &mTexNormal); 
glBindTexture(GL_TEXTURE_2D, mTexNormal); 
//<Texture params> 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mTexNormal, 0); 

glGenTextures(1, &mTexDepth); 
glBindTexture(GL_TEXTURE_2D, mTexDepth); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); 
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, mTexDepth, 0); 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0) 

在渲染之前,我會再次綁定的幀緩衝,然後執行:

GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; 
glDrawBuffers(2, buffers); 

這意味着進一步的調用會引起我的幀緩衝區。 (我認爲?)

然後,我會設置我的着色器並繪製場景。在我的頂點着色器中,我會像往常一樣處理法線/位置/顏色,並將數據傳遞給片段着色器。該片段然後會做這樣的事情:

gl_FragData[0] = OutputColor; 
gl_FragData[1] = OutputNormal; 

在這一點上,我應該有兩個紋理;一個來自所有渲染對象的顏色和一個帶法線的顏色。這一切是否正確?我現在應該可以像使用其他任何其他紋理一樣使用這些紋理,比如說將它們渲染爲全屏四邊形,對吧?

回答

10

聽起來很合理。這確實是通常的做法。如果不需要深度數據作爲紋理進行進一步處理,還可以使用渲染緩衝區作爲附件,但紋理也應該可以正常工作。

完成所有設置後,您還可以使用glCheckFramebufferStatusEXT來查看幀緩衝區在當前配置下是否有效,但代碼看起來不錯。如果你沒有問題,這只是爲了保證,那麼請放心,你在正確的軌道上,否則告訴我們什麼是錯的。

+0

感謝您的回答!這更多的只是一個保證類型的問題,以確保我沒有分配我不需要的東西,而且訂單看起來沒問題。將使用渲染緩衝而不是紋理提供任何性能優勢? – TaylorP

+0

@Tlorlor我不知道,可能不會。 –

+2

我知道這是一個老問題。但是,是的,與使用紋理相比,使用渲染緩衝區會獲得更好的性能。由於渲染緩衝區可以利用更優化的數據存儲方式和處理繪製操作的過程。 – Vallentin