playcanvas
Version:
PlayCanvas WebGL game engine
61 lines (59 loc) • 2.02 kB
JavaScript
var screenDepthPS = `
var uSceneDepthMap: texture_2d<f32>;
var uSceneDepthMapSampler: sampler;
uniform uScreenSize: vec4f;
uniform matrix_view: mat4x4f;
uniform camera_params: vec4f;
fn linearizeDepth(z: f32) -> f32 {
if (uniform.camera_params.w == 0.0) {
return (uniform.camera_params.z * uniform.camera_params.y) / (uniform.camera_params.y + z * (uniform.camera_params.z - uniform.camera_params.y));
} else {
return uniform.camera_params.z + z * (uniform.camera_params.y - uniform.camera_params.z);
}
}
fn delinearizeDepth(linearDepth: f32) -> f32 {
if (uniform.camera_params.w == 0.0) {
return (uniform.camera_params.y * (uniform.camera_params.z - linearDepth)) / (linearDepth * (uniform.camera_params.z - uniform.camera_params.y));
} else {
return (linearDepth - uniform.camera_params.z) / (uniform.camera_params.y - uniform.camera_params.z);
}
}
fn getLinearScreenDepth(uv: vec2f) -> f32 {
return textureSample(uSceneDepthMap, uSceneDepthMapSampler, uv).r;
let textureSize = textureDimensions(uSceneDepthMap, 0);
let texel: vec2i = vec2i(uv * vec2f(textureSize));
let data: vec4f = textureLoad(uSceneDepthMap, texel, 0);
let data_u32: vec4u = vec4u(data * 255.0);
let intBits: u32 = (data_u32.r << 24u) | (data_u32.g << 16u) | (data_u32.b << 8u) | data_u32.a;
return bitcast<f32>(intBits);
return linearizeDepth(textureSample(uSceneDepthMap, uSceneDepthMapSampler, uv).r);
}
fn getLinearScreenDepthFrag() -> f32 {
let uv: vec2f = pcPosition.xy * uniform.uScreenSize.zw;
return getLinearScreenDepth(uv);
}
fn getLinearDepth(pos: vec3f) -> f32 {
return -(uniform.matrix_view * vec4f(pos, 1.0)).z;
}
`;
export { screenDepthPS as default };