2011-06-14 43 views
2

如果我禁用MSAA,我的渲染紋理iPhone代碼纔有效,否則我得到的只是一個黑色紋理。什麼可能是問題的原因?當啓用MSAA時,openGL渲染到iPhone的紋理失敗

這裏是我的代碼:

glViewport(0,0, target->_Width, target->_Height); 
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT Or GL_STENCIL_BUFFER_BIT); 

glBindTexture(GL_TEXTURE_2D, target->_Handle);   

// render stuff here 

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, target->_Width, target->_Height, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

回答

0

你的問題的原因是,你不能呈現在OpenGL ES的多采樣質感。事實上,如果我記得正確的話,OpenGL ES中不存在多重採樣紋理。桌面OpenGL允許你做到這一點,但它引入了一個全新的紋理目標(GL_TEXTURE_2D_MULTISAMPLE)來完成它。

提供多重採樣的緩衝區與普通紋理不同,這就是爲什麼Desktop OpenGL使用特殊的紋理目標,它具有自己的GLSL採樣器類型。

+0

他甚至沒有渲染到紋理(使用FBO),而是使用舊式的複製到紋理。 – 2011-06-14 13:51:49

+0

是的,我正在使用glCopyTexImage2D,但整個渲染髮生在FBO渲染(多重採樣)內,我需要重寫渲染邏輯,我猜 – user797443 2011-06-16 11:18:56

3

顯然,當你爲你的主幀緩衝區使用MSAA時,你必須將它用於你想渲染的任何其他FBO。由於GL_TEXTURE_2D_MULTISAMPLE在OpenGL ES 2上不可用,因此我發現的解決方案很簡單,就是將從常規渲染到MSAA渲染所需的相同修改應用到渲染到紋理代碼。

您需要3個額外的緩衝區:多采樣顏色渲染緩衝區,多采樣深度渲染緩衝區和新的FBO來附加它們。渲染前綁定新的FBO而不是紋理FBO。渲染後,將新的MSAA FBO解析爲紋理FBO,與使用glResolveMultisampleFramebufferAPPLE()的主渲染代碼相同。

請注意,由於某些原因,使用啓用MSAA的紋理渲染在模擬器中使用而沒有這些修改。也許它會自動使用GL_TEXTURE_2D_MULTISAMPLE