2011-09-03 209 views

回答

2

像素緩衝區是OpenGL的平臺特定擴展。在ES中,沒有這樣的擴展,因爲幀緩衝區對象是核心API的一部分。幀緩衝區對象可用於完成離屏渲染,通常用於紋理,然後用於渲染管道內的其他任務。這就是在OpenGL ES中如何實現深度緩衝區陰影和延遲渲染等效果。

例如,要生成鏈接到你已經在其他地方所產生的紋理顏色和深度緩衝的幀緩衝區對象,你可以做:

glGenFramebuffers(1, &framebufferID); 
glBindFramebuffer(GL_FRAMEBUFFER, framebufferID); 

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colourTextureID, 0); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTextureID, 0); 

if((status = glCheckFramebufferStatus(GL_FRAMEBUFFER)) != GL_FRAMEBUFFER_COMPLETE) 
{ 
    // there was some sort of problem 
} 

你會使用glBindFramebuffer到幀緩衝結合以後。如果你想渲染實際看到的東西,你應該重新綁定鏈接到顯示器的幀緩衝區。您將在某處使用EAGLContext -renderbufferStorage:fromDrawable:創建一個幀緩衝區對象,該對象使用CAEAGLLayer作爲顏色緩衝區的存儲區。

鏈接到幀緩衝區的每個單獨事物(例如顏色緩衝區的存儲或深度緩衝區的存儲)稱爲渲染緩衝區。您可以要求驅動程序在不考慮通過glGenRenderbuffersglRenderbufferStorage連接到質感的任何區域內構建它們。因此,例如,如果您喜歡,您可以將顏色緩衝區放在紋理中,讓GPU根據深度緩衝區自己計算出存儲空間。

+1

好的答案,但不要忘記在附加代碼示例中的紋理之前綁定framebuffer。 –

+0

哦,是的,否則你會干擾當前綁定的任何幀緩衝區。我會修復我的代碼。 – Tommy