【问题标题】:Opengl render to Depth texture - red color?Opengl渲染到深度纹理 - 红色?
【发布时间】:2013-10-21 16:54:32
【问题描述】:

我正在尝试实现阴影映射,因此我正在渲染深度纹理。当我不绑定包含深度纹理的帧缓冲区并使用默认帧缓冲区时,它会输出到屏幕。然而,远处的碎片不是白色的,而是红色的。

这是我的片段着色器:

#version 330 

out float fragmentdepth;
uniform sampler2D inputTex;

void main(){
fragmentdepth = gl_FragCoord.z;
}

有问题吗?因为阴影映射不起作用,我想排除这是问题的根源。

【问题讨论】:

  • 如果您正在写入深度纹理,为什么要将深度输出到颜色缓冲区?这基本上使此着色器的内存带宽需求增加了一倍,因为深度也写入到附加到 FBO 深度连接点的任何内容。
  • 我不记得了,但gl_FragDepth 并没有像gl_FragColour 那样被删除,对吧?如果 fragmentdepth 在其他 RGBA 输出到 COLOUR_ATTACHMENT0 中被简单地视为红色,这将是有意义的。除非您打算将深度写入浮点颜色纹理而不是深度纹理,但无论如何您仍然需要深度测试,正如@AndonM.Coleman 指出的那样,这将是带宽的两倍。也许尝试写信给gl_FragDepth?
  • 绝对不是,gl_FragDepth 仍然存在。但是,在着色器中写入任何内容是一个非常的坏主意,因为它破坏了许多硬件深度优化(Hi-Z、早期深度测试等)。
  • 你最后得到你的影子了吗?深度纹理被涂成红色有关系吗?

标签: opengl glsl


【解决方案1】:

深度是一个标量值。标量被 OpenGL 解释为单分量纹理。单组件纹理意味着只有 .x 或 .r 元素(无论您使用什么)变得非零。

【讨论】:

  • 当我在着色器中读取纹理时,x、y 和 z 元素不为零。
  • @user1760770 这是因为对于 GLSL >= 130 的版本,任何绑定了深度纹理的 sampler2D 将始终返回 vec4 (r, r, r, 1.0),无论您如何设置 @ 987654324@(因为它已从 GL3 中删除)。这在 pg 中进行了解释。 OpenGL 3.2 core spec 中的 320 个。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
相关资源
最近更新 更多