Multisampled render to texture in ios

后端 未结 2 1161
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-31 23:37

I am attempting to render to a texture in ios with multisampling enabled and then use that texture in my final output. Is this possible?

So far I have only gotten black

相关标签:
2条回答
  • 2021-02-01 00:07

    Yes! I found what I was doing wrong. I wrongly thought that I could have the following:

    Framebuffer

    • Multisampled colour render buffer attached to a texture

    • Multisampled depth buffer

    But you cannot do this. D: You have to have the following:

    Multisampled framebuffer:

    • Multisampled colour render buffer (Not attached to a texture)

    • Multisampled depth render buffer

    Normal framebuffer:

    • Colour render buffer attached to a texture. This is what will be written to by glResolveMultisampleFramebufferAPPLE() and what we will use to render the result.

    • No depth buffer.

    I.e. you have to copy the results of the multisampled render to a whole new framebuffer.

    Some code:

      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
    

    Thanks Goz, you got me in the right direction!

    0 讨论(0)
  • 2021-02-01 00:07

    I assume you've been working from the sample on this page?

    Remove the glFramebufferTexture2D call as this may be causing the multisample render buffer to detach and hence you are have a multisampled back buffer and a single sampled render buffer. Furthermore, creating a single sampled depth buffer wil solve your issues as it will not be paired with theat single sampled render buffer.

    Edit: When do you get the error? On the one creating the render buffer? If so you may be best off trying it exactly as in the link I posted (which I assume you are working for).

    ie.

    glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height);
    
    0 讨论(0)
提交回复
热议问题