【问题标题】:OpenGL FBO depth format and type confusionOpenGL FBO 深度格式和类型混淆
【发布时间】:2016-09-01 11:31:26
【问题描述】:

我对内部格式、格式和类型有点困惑。那么深度附着点呢?

如果我使用的是 RenderBuffer,如果我不想使用模板,我认为这是有效的代码:

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRB);

但是,如果我希望能够读取深度值,则必须将纹理附加到深度连接点。所以我必须调用一个带有参数“内部格式”、“格式”和“类型”的glTexImage2D函数。

在这种情况下,我应该选择哪种内部格式、格式和类型?我可以将以下组合用于深度附件吗? (依次为:内部格式、格式和类型)

  • GL_R32F、GL_RED、GL_FLOAT
  • GL_DEPTH_COMPONENT32、GL_DEPTH_COMPONENT、GL_UNSIGNED_INT
  • GL_DEPTH_COMPONENT32F、GL_DEPTH_COMPONENT、GL_FLOAT

GL_UNSIGNED_INT 类型对第二种情况有效吗?那个的真实意义是什么?它会为每个片段分配 4 个字节吗?在一些教程中,他们使用 GL_UNSIGNED_BYTE 作为类型参数。哪个是正确的?

谢谢

编辑

澄清了我对哪些参数感兴趣的问题。

【问题讨论】:

  • “格式”和“类型”是什么意思?渲染缓冲区只有内部格式,没有外部格式。或者您是在问应该在glReadPixels 通话中使用哪种外部格式?
  • 根据 Khronos Group 参考页面,您只能使用以下格式作为渲染缓冲区的内部格式:GL_RGBA4、GL_RGB565、GL_RGB5_A1、GL_DEPTH_COMPONENT16 或 GL_STENCIL_INDEX8 glRenderbufferStorage reference page
  • @peppe:“你是什么意思,“格式”和“类型”?”他说的是像素传输参数。最后三个参数为glTexImage2D
  • @Matso 您提供的链接指向 OpenGL ES 文档。 OpenGL 有更多支持的格式。
  • 重申上面@peppe 的问题:“读取深度值”是什么意思?如果附件是渲染缓冲区,您可以使用glReadPixels()。您的意思是要在着色器代码中对深度图像进行采样?

标签: opengl texture2d fbo


【解决方案1】:

深度值不是颜色值。因此,如果您想在纹理中存储深度值,则纹理必须使用internal format that contains depth information

pixel transfer format/type 参数,即使您实际上没有传递数据,也必须在内部格式方面仍然是合理的。由于内部格式包含深度信息,因此您的像素传输格式必须指定深度信息:GL_DEPTH_COMPONENT

至于像素传输类型,你应该把32F读回GL_FLOAT

【讨论】:

  • 这意味着 OP 中的第一个选项无效(如我所想)。我现在正在使用第三个,但我真的必须选择那个吗?我将在着色器中对纹理进行采样。基于浮点数和基于整数的版本有什么区别吗?如果我不使用浮点版本(又名 *32F),我应该选择哪种像素传输类型?
猜你喜欢
  • 2018-10-28
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多