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渲染到深度纹理 - 红色?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL(FBO)中的普通后台缓冲区+渲染到深度纹理

Opengl渲染到纹理,但纹理为空

OpenGL4 多重采样抗锯齿和渲染到纹理

是否可以在opengl中使用深度缓冲区渲染3D纹理

在 CUDA 中使用 OpenGL 深度信息

哪些 OpenGL ES 2.0 纹理格式可进行颜色、深度或模板渲染?