【发布时间】:2011-06-20 08:57:19
【问题描述】:
我想在片段着色器中绘制深度缓冲区,我这样做:
顶点着色器:
varying vec4 position_;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
position_ = gl_ModelViewProjectionMatrix * gl_Vertex;
片段着色器:
float depth = ((position_.z / position_.w) + 1.0) * 0.5;
gl_FragColor = vec4(depth, depth, depth, 1.0);
但我打印的都是白色的,我做错了什么?
【问题讨论】:
-
我想了解更多上下文;着色器说明,因为它们对我来说看起来不错。您为顶点指定什么颜色?我唯一能想到的是,着色器没有完全加载,并且您正在运行默认的固定管道设置,这会顺便绘制写入图元。用于调试设置 glColor3f(1,0,0);在你的主程序和 gl_FragColor = vec4(0, depth, 0, 1.0);在着色器中区分固定函数和着色器管道。
-
我在 gDebugger 中进行了一些调试,我的代码是正确的,一切都是白色的原因是深度值非常接近 1,0.999、0.98888。 gl_fragcolor 将纹理中的颜色设置为 256
-
由于深度值的非线性分布,这在透视投影情况下是可以预料的。请参阅@Nicol Bolas 的回答。
-
仔细想想,这些值表明近距和远距剪裁平面距离的选择并不理想。理想情况下,近和远剪辑平面“接触”场景,即近剪辑平面尽可能远,远剪辑平面尽可能靠近。如果你的裁剪平面是这样设置的,你应该会看到至少有一些深度值接近 0。
-
感谢您的精彩解释