当前片段的深度存储在.z
的组成部分gl_FragCoord。深度存储在范围 [0.0, 1.0] 中(除非该范围由glDepthRangef):
有了这些信息,您可以设置点的 Alpha 通道,并根据其深度降低不透明度:
float depth = gl_FragCoord.z;
gl_FragColor = vec4(vColor, 1.0 - depth);
由于深度为透视投影不是线性的(参见如何在现代 OpenGL 中使用片段着色器中的 gl_FragCoord.z 线性渲染深度?),最好有一个 rage [0.0, 1.0] 的值,它线性地表示近平面和远平面之间的点的深度。
这可以通过函数来完成LinearizeDepth
在以下示例中:
uniform vec2 u_depthRange;
float LinearizeDepth(float depth, float near, float far)
{
float z = depth * 2.0 - 1.0; // Back to NDC
return (2.0 * near * far / (far + near - z * (far - near)) - near) / (far-near);
}
void main()
{
// [...]
float lineardepth = LinearizeDepth(gl_FragCoord.z, u_depthRange[0], u_depthRange[1]);
gl_FragColor = vec4(vColor, 1.0 - lineardepth);
}
为了使示例运行,深度范围必须设置为统一的u_depthRange
。的近平面PerspectiveCamera存储在.x
分量和远平面.y
成分:
var near = 1, far = 10
camera = new THREE.PerspectiveCamera(fov, width / height, near, far);
var uniforms = {
// [...]
u_depthRange: {type: 'v2', value: {x:near, y: far}}
};
var material = new THREE.ShaderMaterial({
uniforms: uniforms,
// [...]
});
请注意,为了获得“良好”的效果,相机的近平面和远平面必须尽可能接近几何形状!