启用MSAA时,iPhone中的openGL渲染到纹理失败

时间:2011-06-14 10:20:42

标签: iphone opengl-es textures msaa

我对纹理iPhone代码的渲染只有在我禁用MSAA时才有效,否则我得到的只是黑色纹理。可能是问题的原因是什么?

这是我的代码:

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);

2 个答案:

答案 0 :(得分:3)

显然,当您使用MSAA作为主帧缓冲区时,您必须将它用于您想要渲染的任何其他FBO。由于GL_TEXTURE_2D_MULTISAMPLE在OpenGL ES 2上不可用,我找到的解决方案非常简单,可以应用从常规渲染到MSAA渲染所需的相同修改,以及渲染到纹理代码。 / p>

您需要3个额外的缓冲区:多采样颜色渲染缓冲区,多采样深度渲染缓冲区以及将它们附加到的新FBO。在渲染之前绑定新的FBO而不是纹理FBO。渲染后,将新的MSAA FBO解析为纹理FBO,就像使用glResolveMultisampleFramebufferAPPLE()在主渲染代码中一样。

请注意,出于某种原因,启用MSAA的纹理渲染在模拟器中无需这些修改即可运行。也许它会自动使用GL_TEXTURE_2D_MULTISAMPLE

答案 1 :(得分:0)

问题的原因是您无法在OpenGL ES中渲染到多重采样纹理。实际上,如果我没记错的话,OpenGL ES中不存在多重采样纹理。桌面OpenGL允许你这样做,但它引入了一个全新的纹理目标(GL_TEXTURE_2D_MULTISAMPLE)来实现它。

提供多重采样的缓冲区与常规纹理不同;这就是为什么Desktop OpenGL使用特殊的纹理目标,它有自己的GLSL采样器类型。