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