8

我正在使用带着色器的 THREE.js。我正在尝试获取 zbuffer 信息。

顶点着色器:

// switch on high precision floats
#ifdef GL_ES
precision highp float;
#endif

void main()
{
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

片段着色器:

#ifdef GL_ES
precision highp float;
#endif

void main()
{
    gl_FragColor = vec4(gl_FragCoord.x, gl_FragCoord.y, gl_FragCoord.z, 1.0);
}

场景中有不同位置的对象,因此 zbuffer 中的值应该不同。

奇怪的是gl_FragCoord.xgl_FragCoord.ygl_FragCoord.z似乎1.0适用于所有片段,而gl_FragCoord.w对于不同的片段似乎有所不同。

如果我使用gl_FragCoord.w

#ifdef GL_ES
precision highp float;
#endif

void main()
{
    float zbuffer = gl_FragCoord.w * 500.0;
    gl_FragColor = vec4(zbuffer, zbuffer, zbuffer, 1.0);
}

它似乎是 zbuffer 图像:

在此处输入图像描述

那么为什么gl_FragCoord.w要表示深度信息,而gl_FragCoord.z总是1.0针对所有片段呢?

4

1 回答 1

16

gl_FragCoord窗口空间窗口空间位于窗口的像素坐标中。所以几乎你所有的片段都会有 > 1.0 的值。而且由于您几乎可以肯定不会渲染到浮点帧缓冲区,因此您的颜色将被限制在 [0, 1] 范围内。

gl_FragCoord.z可能不是 1.0,但它可能足够接近它,具体取决于您的深度范围以及物体与相机的距离。如果您想真正了解深度,则需要对其进行线性化

于 2013-03-01T05:32:51.827 回答