我正在使用着色器使用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.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);
}
似乎是zbuffer图片:
那么,为什么gl_FragCoord.w
代表深度信息,gl_FragCoord.z
始终为1.0
所有片段?
答案 0 :(得分:15)
gl_FragCoord
位于窗口空间中。 window space位于窗口的像素坐标中。因此,几乎所有碎片都具有值> 1.0。由于你几乎肯定不会渲染到浮点帧缓冲区,因此你的颜色会被限制在[0,1]范围内。
gl_FragCoord.z
可能不是1.0,但它可能足够接近它,具体取决于您的深度范围以及物体离相机的距离。如果您想深入了解深度,则需要linearize it。