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

问题描述

| 我的渲染纹理iPhone代码仅在禁用MSAA的情况下有效,否则,我得到的只是黑色纹理。是什么原因引起的? 这是我的代码
glViewport(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,GL_RGBA,target->_Height,0);
glBindTexture(GL_TEXTURE_2D,0);
    

解决方法

        显然,当您将MSAA用于主帧缓冲区时,还必须将其用于要渲染到的任何其他FBO。由于ES1ѭ在OpenGL ES 2上不可用,因此我发现的解决方案非常简单,就是应用从常规渲染到MSAA渲染以及渲染到纹理代码所需的修改。 您需要3个额外的缓冲区:一个多采样的颜色渲染缓冲区,一个多采样的深度渲染缓冲区以及一个新的FBO来附加它们。在渲染之前,绑定新的FBO而不是纹理FBO。渲染后,将新的MSAA FBO解析为纹理FBO,就像使用
glResolveMultisampleFramebufferAPPLE()
在主渲染代码中所做的一样。 请注意,由于某些原因,启用了MSAA的纹理渲染无需在模拟器中进行这些修改即可工作。也许它会自动使用
GL_TEXTURE_2D_MULTISAMPLE
?     ,        问题的原因是您无法在OpenGL ES中渲染为多采样纹理。实际上,如果我没记错的话,OpenGL ES中不存在多重采样纹理。桌面OpenGL允许您执行此操作,但是为此引入了一个全新的纹理目标(GL_TEXTURE_2D_MULTISAMPLE)。 提供多重采样的缓冲区与常规纹理不同。这就是Desktop OpenGL使用特殊纹理目标的原因,该目标具有自己的GLSL采样器类型。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...