【发布时间】: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、早期深度测试等)。 -
你最后得到你的影子了吗?深度纹理被涂成红色有关系吗?