gl_FragCoord.x,y,z为所有像素为1,w为深度

Ovi*_*lia 7 shader zbuffer glsl webgl three.js

我正在使用带着色器的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);
}
Run Code Online (Sandbox Code Playgroud)

片段着色器:

#ifdef GL_ES
precision highp float;
#endif

void main()
{
    gl_FragColor = vec4(gl_FragCoord.x, gl_FragCoord.y, gl_FragCoord.z, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

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

奇怪的是gl_FragCoord.x,gl_FragCoord.y并且gl_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);
}
Run Code Online (Sandbox Code Playgroud)

它似乎是zbuffer图像:

在此输入图像描述

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

Nic*_*las 15

gl_FragCoord窗口空间.和窗口空间是在窗口的像素坐标.因此,几乎所有碎片的值都大于1.0.由于您几乎肯定不会渲染到浮点帧缓冲区,因此您的颜色将被限制在[0,1]范围内.

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

  • 另外,如果有人问为什么`w`有深度,实际上它根据标准有"1/z",但是`z`远高于1,因此将'w`值放在0-1中范围.较深的深度会产生较暗的像素,较低的深度较亮的像素,这就是OP获得这些结果的原因. (2认同)