多重采样渲染到ios中的纹理

我试图在启用了多重采样的情况下渲染到ios中的纹理,然后在我的最终输出中使用该纹理。 这可能吗?

到目前为止,我只获得了黑色纹理或混淆图像。 我使用的代码是:

glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glGenRenderbuffers(1, &colorRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); //glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, width, height); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA4, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); glGenRenderbuffers(1, &depthRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, self.view.bounds.size.height); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; if(status != GL_FRAMEBUFFER_COMPLETE) { NSLog(@"failed to make complete framebuffer object %x", status); } // Render my scene glBindFramebuffer( GL_FRAMEBUFFER, framebuffer ); glViewport(0,0,width,height); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Draw scene // Then bind default framebuffer glBindFramebuffer( GL_FRAMEBUFFER, 1 ); // Draw other things // Now resolve the multisampling and draw texture glResolveMultisampleFramebufferAPPLE(); glUseTexture( GL_TEXTURE_2D, texture ); // Draw with texture 

此代码不起作用。 如果我对深度渲染缓冲区进行多重采样,则会失败。 如果我只使用普通的fbo作为深度,那么它可以工作,但会产生一个别名图像。

谁知道我哪里出错了?

谢谢!

是! 我发现我做错了什么。 我错误地认为我可以拥有以下内容:

帧缓冲区

  • 附加到纹理的多重采样颜色渲染缓冲区

  • 多重采样深度缓冲区

但你不能这样做。 D:您必须具备以下条件:

多重采样帧缓冲:

  • 多重采样颜色渲染缓冲区(未附加到纹理)

  • 多重采样深度渲染缓冲区

正常帧缓冲:

  • 颜色回报缓冲附有纹理。 这是glResolveMultisampleFramebufferAPPLE()将写入的内容以及我们将用于呈现结果的内容。

  • 没有深度缓冲。

即,您必须将多重采样渲染的结果复制到一个全新的帧缓冲区。

一些代码:

  glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glGenFramebuffers(1, &resolved_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, resolved_framebuffer); glGenRenderbuffers(1, &resolvedColorRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, resolvedColorRenderbuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glGenRenderbuffers(1, &colorRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); glGenRenderbuffers(1, &depthRenderbuffer); glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; if(status != GL_FRAMEBUFFER_COMPLETE) { NSLog(@"failed to make complete framebuffer object %x", status); } // Render my scene glBindFramebuffer( GL_FRAMEBUFFER, framebuffer ); glViewport(0,0,width,height); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Draw scene // Then bind default framebuffer glBindFramebuffer( GL_FRAMEBUFFER, 1 ); // Draw other things // Now resolve the multisampling into the other fbo glBindFramebuffer( GL_READ_FRAMEBUFFER_APPLE, framebuffer ); glBindFramebuffer( GL_DRAW_FRAMEBUFFER_APPLE, resolved_framebuffer ); glResolveMultisampleFramebufferAPPLE(); glBindTexture( GL_TEXTURE_2D, texture ); // Draw with texture 

谢谢Goz,你让我朝着正确的方向前进!

我假设你一直在这个页面上的样本工作?

删除glFramebufferTexture2D调用,因为这可能导致多重采样渲染缓冲区分离,因此您有一个多重采样后缓冲区和一个采样渲染缓冲区。 此外,创建单个采样深度缓冲区将解决您的问题,因为它不会与单个采样渲染缓冲区配对。

编辑:你什么时候收到错误? 在创建渲染缓冲区的那个? 如果是这样,你可能最好尝试它,就像我发布的链接一样(我假设你正在努力)。

即。

 glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height);