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

时间:2013-03-01 05:22:53

标签: glsl three.js webgl shader zbuffer

我正在使用着色器使用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图片:

enter image description here

那么,为什么gl_FragCoord.w代表深度信息,gl_FragCoord.z始终为1.0所有片段?

1 个答案:

答案 0 :(得分:15)

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

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