【问题标题】:Multisampled render to texture in iosios中的多采样渲染到纹理
【发布时间】:2011-09-13 13:16:40
【问题描述】:

我正在尝试在启用了多重采样的 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 作为深度,那么它可以工作,但会产生一个混叠图像。

有人知道我哪里出错了吗?

谢谢!

【问题讨论】:

  • 深度缓冲区创建本身是否失败?即是 glRenderbufferStorageMultisampleAPPLE 调用失败了吗?
  • 该调用没有给出 glGetError(),但 glCheckFramebufferStatus() 返回 GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 谢谢~

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


【解决方案1】:

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

帧缓冲

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

  • 多重采样深度缓冲区

但你不能这样做。 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,你让我找到了正确的方向!

【讨论】:

    【解决方案2】:

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

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

    编辑:您何时收到错误消息?一方面创建渲染缓冲区?如果是这样,您最好按照我发布的链接(我假设您正在为此工作)尝试它。

    即。

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

    【讨论】:

    • 我可以获得单次采样深度和多重采样设置来处理这些更改,但仍会获得黑色纹理。我还发现 glResolveMultisampleFramebufferAPPLE() 这样做时会给出 GL_INVALID_FRAMEBUFFER_OPERATION。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2012-07-12
    • 2018-03-11
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多