Opengl渲染到深度纹理 - 红色?
Posted
技术标签:
【中文标题】Opengl渲染到深度纹理 - 红色?【英文标题】:Opengl render to Depth texture - red color? 【发布时间】: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、早期深度测试等)。
你最后得到你的影子了吗?深度纹理被涂成红色有关系吗?
【参考方案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 个。以上是关于Opengl渲染到深度纹理 - 红色?的主要内容,如果未能解决你的问题,请参考以下文章