附加到帧缓冲区的OpenGL多样本整数纹理无法正确解析

3号

因此,我使用了多个渲染目标帧缓冲区,在该缓冲区上,第一个颜色附件是颜色纹理(RGBA8),而第二个绘制缓冲区(颜色附件1)是索引纹理(R32UI)。

gl::BindTexture(gl::TEXTURE_2D_MULTISAMPLE, m_Textures[eTEXTURE_COLORBUFFER]);
gl::TexParameteri(gl::TEXTURE_2D_MULTISAMPLE, gl::TEXTURE_BASE_LEVEL, 0);
gl::TexParameteri(gl::TEXTURE_2D_MULTISAMPLE, gl::TEXTURE_MAX_LEVEL, 0);
gl::TexImage2DMultisample(gl::TEXTURE_2D_MULTISAMPLE, m_Multisample,gl::RGBA8,width,height,gl::FALSE_);

gl::BindTexture(gl::TEXTURE_2D_MULTISAMPLE, m_Textures[eTEXTURE_CLASSBUFFER]);
gl::TexParameteri(gl::TEXTURE_2D_MULTISAMPLE, gl::TEXTURE_BASE_LEVEL, 0);
gl::TexParameteri(gl::TEXTURE_2D_MULTISAMPLE, gl::TEXTURE_MAX_LEVEL, 0);
gl::TexImage2DMultisample(gl::TEXTURE_2D_MULTISAMPLE, m_Multisample,gl::R32UI,width,height,gl::FALSE_);

两种纹理都经过了多重采样,一旦渲染完成,我想将它们下载到CPU上。虽然,当我将多样本FBO分割为单样本FBO时,返回的索引纹理数据由全零组成,而颜色纹理已正确解析。

// Resolve multisampling
if ( m_Multisample > 0 )
{
    gl::BindFramebuffer(gl::READ_FRAMEBUFFER, m_Framebuffers[eFBO_RENDERBUFFER]);
    gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER, m_Framebuffers[eFBO_RESOLVEBUFFER]);
    gl::BlitFramebuffer(0, 0, m_FrameDims, m_FrameDims, 0, 0, m_FrameDims, m_FrameDims, 
        gl::COLOR_BUFFER_BIT, gl::NEAREST);

    gl::enum_t blit_error = gl::NO_ERROR_;
    blit_error = gl::GetError();
    if ( blit_error != gl::NO_ERROR_ )
    {
        throw framebuffer_error(string::format<128>(
            "BlitFramebuffer failed with error: %d",blit_error));
    }

    gl::BindFramebuffer(gl::READ_FRAMEBUFFER, m_Framebuffers[eFBO_RESOLVEBUFFER]);
}

我使用NEARST标志是因为,实际上似乎整数纹理不适用于LINEAR插值。

下面列出了我用于下载图片的代码。

uint32_t* tex_data = new uint32_t[query.m_FrameDims*query.m_FrameDims];
memset(tex_data,0,sizeof(uint32_t)*query.m_FrameDims*query.m_FrameDims);
gl::BindTexture(gl::TEXTURE_2D,query.m_DestColorTexture);
{
    // Copy color texture
    gl::ReadBuffer(gl::COLOR_ATTACHMENT0);
    gl::ReadPixels(0,0,query.m_FrameDims,query.m_FrameDims,
        gl::RGBA,gl::UNSIGNED_BYTE,tex_data);
    gl::TexSubImage2D(gl::TEXTURE_2D,0,0,0,query.m_FrameDims,query.m_FrameDims,
        gl::RGBA,gl::UNSIGNED_BYTE,tex_data);
}

gl::BindTexture(gl::TEXTURE_2D,query.m_DestClassTexture);
{
    // Copy class texture
    gl::ReadBuffer(gl::COLOR_ATTACHMENT1);                      
    gl::ReadPixels(0,0,query.m_FrameDims,query.m_FrameDims,
            gl::RED_INTEGER,gl::UNSIGNED_INT,tex_data);
    gl::TexSubImage2D(gl::TEXTURE_2D,0,0,0,query.m_FrameDims,query.m_FrameDims,
            gl::RED_INTEGER,gl::UNSIGNED_INT,tex_data);
}

delete[] tex_data;

如果禁用多样本FBO,则避免调用gl :: BlitFramebuffer()函数,一切正常。

我看不到任何说明整数纹理可以多次采样的文档,但是尽管如此,我不确定它们是否完全有意义。

有什么线索让我误会吗?

安东·科尔曼

每次进行帧缓冲区blit时,您只能从单个颜色缓冲区中读取数据您可以写入许多绘图缓冲区(技术上最多GL_MAX_DRAW_BUFFERS一次)。这里的问题是,您想从两个不同的颜色缓冲区中读取数据,并且试图在一次blit中进行读取

OpenGL 4.4核心规范-18.3。复制像素-(第483页)

当颜色缓冲器被传送时,值是从所拍摄的读取缓冲器的读取帧缓冲器的和写入到每个所述平局缓冲器绘制帧缓冲区。


您的代码向我指示您实际上忘记对第二个颜色附件进行第二次涂抹,这就是为什么它变空的原因。

要更正此问题,我希望看到类似以下内容的内容:

// Resolve multisampling
if ( m_Multisample > 0 )
{
  //
  // Do the first resolve (COLOR_ATTACHMENT0)
  //
  gl::BindFramebuffer(gl::READ_FRAMEBUFFER,m_Framebuffers[eFBO_RENDERBUFFER]);
  gl::ReadBuffer     (gl::COLOR_ATTACHMENT0); // Read:  Attachment 0 (MSAA)

  gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER,m_Framebuffers[eFBO_RESOLVEBUFFER]);
  gl::DrawBuffer     (gl::COLOR_ATTACHMENT0); // Write: Attachment 0 (Resolve)

  gl::BlitFramebuffer(0, 0, m_FrameDims, m_FrameDims, 0, 0, m_FrameDims,
      m_FrameDims, gl::COLOR_BUFFER_BIT, gl::NEAREST);

  gl::enum_t blit_error = gl::NO_ERROR_;
  blit_error = gl::GetError();
  if ( blit_error != gl::NO_ERROR_ )
  {
      throw framebuffer_error(string::format<128>(
          "BlitFramebuffer failed with error: %d",blit_error));
  }

  //
  // Do the second resolve (COLOR_ATTACHMENT1)
  //
  gl::BindFramebuffer(gl::READ_FRAMEBUFFER,m_Framebuffers[eFBO_RENDERBUFFER]);
  gl::ReadBuffer     (gl::COLOR_ATTACHMENT1); // Read:  Attachment 1 (MSAA)

  gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER,m_Framebuffers[eFBO_RESOLVEBUFFER]);
  gl::DrawBuffer     (gl::COLOR_ATTACHMENT1); // Write: Attachment 1 (Resolve)

  gl::BlitFramebuffer(0, 0, m_FrameDims, m_FrameDims, 0, 0, m_FrameDims,
      m_FrameDims, gl::COLOR_BUFFER_BIT, gl::NEAREST);

  gl::enum_t blit_error = gl::NO_ERROR_;
  blit_error = gl::GetError();
  if ( blit_error != gl::NO_ERROR_ )
  {
      throw framebuffer_error(string::format<128>(
          "BlitFramebuffer failed with error: %d",blit_error));
  }

  gl::BindFramebuffer(gl::READ_FRAMEBUFFER,m_Framebuffers[eFBO_RESOLVEBUFFER]);
}

假设要从中进行贴图的纹理/渲染缓冲区/具有相同的附着点。如果没有,你可以调整gl::ReadBuffer (...)gl::DrawBuffer (...)相应。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

附加到帧缓冲区的OpenGL多样本整数纹理无法正确解析

来自分类Dev

如何使用多样本帧缓冲区在OpenGL中选择几何?

来自分类Dev

glDeleteFramebuffers删除帧缓冲区对象,它是否删除附加到该帧缓冲区的纹理?

来自分类Dev

是否可以将纹理作为渲染目标附加到默认帧缓冲区?

来自分类Dev

调整大小后是否应将纹理重新附加到帧缓冲区

来自分类Dev

OpenGL ES 2.0将纹理附加到模板缓冲区

来自分类Dev

GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT尝试创建多样本帧缓冲区

来自分类Dev

OpenGL:帧缓冲区-绘制纹理-glClearColor

来自分类Dev

为什么从帧缓冲区创建的纹理无法正确映射

来自分类Dev

无法渲染到帧缓冲区(纹理)

来自分类Dev

正确创建多样本纹理

来自分类Dev

WebGL将纹理帧缓冲区复制到纹理帧缓冲区?

来自分类Dev

冗余顶点缓冲区导致OpenGL无法正确绘制

来自分类Dev

冗余顶点缓冲区导致OpenGL无法正确绘制

来自分类Dev

运行OpenGL着色器以修改现有的纹理/帧缓冲区

来自分类Dev

从当前绑定到帧缓冲区的纹理单元进行OpenGL读取

来自分类Dev

如何从OpenGL中的帧缓冲区纹理中采样像素?

来自分类Dev

将立方体贴图纹理附加到帧缓冲区对象(FBO)时为GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

来自分类Dev

OpenGL帧缓冲区+ LibGDX

来自分类Dev

OpenGL帧缓冲区绑定目标

来自分类Dev

将GL_2D_ARRAY_TEXTURE中的特定层附加到帧缓冲区

来自分类Dev

如何访问默认帧缓冲区的纹理

来自分类Dev

OpenGL纹理缓冲区对象的目的是什么?

来自分类Dev

OpenGL纹理缓冲区对象的目的是什么?

来自分类Dev

OpenGL ES 2.0-如何有效地将纹理复制到帧缓冲区

来自分类Dev

如何在 OpenGL 中重新定位绑定到帧缓冲区的 2D 纹理?

来自分类Dev

OpenGL 3.0:无法在着色器中使用帧缓冲区对象(黑色)

来自分类Dev

OpenGL 3.0:无法在着色器中使用帧缓冲区对象(黑色)

来自分类Dev

OpenGL ES2.0 glReadPixels()从渲染缓冲区通过帧缓冲区读取数据

Related 相关文章

  1. 1

    附加到帧缓冲区的OpenGL多样本整数纹理无法正确解析

  2. 2

    如何使用多样本帧缓冲区在OpenGL中选择几何?

  3. 3

    glDeleteFramebuffers删除帧缓冲区对象,它是否删除附加到该帧缓冲区的纹理?

  4. 4

    是否可以将纹理作为渲染目标附加到默认帧缓冲区?

  5. 5

    调整大小后是否应将纹理重新附加到帧缓冲区

  6. 6

    OpenGL ES 2.0将纹理附加到模板缓冲区

  7. 7

    GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT尝试创建多样本帧缓冲区

  8. 8

    OpenGL:帧缓冲区-绘制纹理-glClearColor

  9. 9

    为什么从帧缓冲区创建的纹理无法正确映射

  10. 10

    无法渲染到帧缓冲区(纹理)

  11. 11

    正确创建多样本纹理

  12. 12

    WebGL将纹理帧缓冲区复制到纹理帧缓冲区?

  13. 13

    冗余顶点缓冲区导致OpenGL无法正确绘制

  14. 14

    冗余顶点缓冲区导致OpenGL无法正确绘制

  15. 15

    运行OpenGL着色器以修改现有的纹理/帧缓冲区

  16. 16

    从当前绑定到帧缓冲区的纹理单元进行OpenGL读取

  17. 17

    如何从OpenGL中的帧缓冲区纹理中采样像素?

  18. 18

    将立方体贴图纹理附加到帧缓冲区对象(FBO)时为GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

  19. 19

    OpenGL帧缓冲区+ LibGDX

  20. 20

    OpenGL帧缓冲区绑定目标

  21. 21

    将GL_2D_ARRAY_TEXTURE中的特定层附加到帧缓冲区

  22. 22

    如何访问默认帧缓冲区的纹理

  23. 23

    OpenGL纹理缓冲区对象的目的是什么?

  24. 24

    OpenGL纹理缓冲区对象的目的是什么?

  25. 25

    OpenGL ES 2.0-如何有效地将纹理复制到帧缓冲区

  26. 26

    如何在 OpenGL 中重新定位绑定到帧缓冲区的 2D 纹理?

  27. 27

    OpenGL 3.0:无法在着色器中使用帧缓冲区对象(黑色)

  28. 28

    OpenGL 3.0:无法在着色器中使用帧缓冲区对象(黑色)

  29. 29

    OpenGL ES2.0 glReadPixels()从渲染缓冲区通过帧缓冲区读取数据

热门标签

归档