opengl - 使用着色器在opengl中绘制深度值

标签 opengl shader

我想在片段着色器中绘制深度缓冲区,我这样做:

顶点着色器:

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);

但是我打印的都是白色的,我做错了什么?

最佳答案

您想在哪个空间绘制深度?如果要绘制窗口空间深度,可以这样做:

gl_FragColor = vec4(gl_FragCoord.z);

但是,这不会特别有用,因为大多数数字将非常接近 1.0。只有非常接近的物体才会可见。这是使用标准透视投影的深度缓冲区的深度值分布的本质。

或者,换句话说,这就是你变白的原因。

如果您希望这些值在线性空间中,则需要执行以下操作:
float ndcDepth = ndcPos.z =
    (2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) /
    (gl_DepthRange.far - gl_DepthRange.near);
float clipDepth = ndcDepth / gl_FragCoord.w;
gl_FragColor = vec4((clipDepth * 0.5) + 0.5); 

关于opengl - 使用着色器在opengl中绘制深度值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6408851/

相关文章:

c++ - OpenGL - gluOrtho2d 和 glLoadIdentity?

c++ - 如何诊断 Windows 上的堆损坏错误?

opengl - 为什么具有 Opengl 3.0 上下文的 SFML 会绘制两次?

unity3d - 在 Unity 着色器中波动浮点值

c - 在 C 中使用 OpenGL 3 动画场景

opengl - VertexArrayObject,如何设置 "default"属性值?

c# - Android 设备上的表面光闪烁

shader - AGAL seq 操作码适用于硬件,但不适用于软件仿真(两者的 float 比较不同?)

objective-c - iOS 视网膜屏幕的着色器优化

linux - OpenGL 应用程序导致 Xorg 泄漏