2

我的纹理 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);
4

2 回答 2

3

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

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

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

于 2011-09-12T09:16:36.960 回答
0

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

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

于 2011-06-14T11:53:35.883 回答