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

时间:2011-09-13 13:16:40

标签: iphone c++ ios graphics opengl-es

我试图在启用了多重采样的情况下渲染到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作为深度,那么它可以工作,但会产生一个别名图像。

任何人都知道我哪里出错了?

谢谢!

2 个答案:

答案 0 :(得分:15)

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

Framebuffer的

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

  • 多重采样深度缓冲区

但你不能这样做。 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,你让我朝着正确的方向前进!

答案 1 :(得分:2)

我假设您一直在使用this page上的示例工作?

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

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

glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height);
相关问题