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