playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
91 lines (89 loc) • 2.85 kB
JavaScript
var skybox_default = `
varying vLinearDepth: f32;
varying vViewDir : vec3f;
uniform skyboxHighlightMultiplier : f32;
uniform fisheye_k : f32;
uniform fisheye_invK : f32;
uniform fisheye_projMat00 : f32;
uniform fisheye_projMat11 : f32;
uniform matrix_view : mat4x4f;
uniform cubeMapRotationMatrix : mat3x3f;
varying vClipXYW : vec3f;
var texture_cubeMap : texture_cube<f32>;
var texture_cubeMap_sampler : sampler;
varying vWorldPos : vec3f;
uniform cubeMapRotationMatrix : mat3x3f;
uniform projectedSkydomeCenter : vec3f;
var texture_envAtlas : texture_2d<f32>;
var texture_envAtlas_sampler : sampler;
uniform mipLevel : f32;
@fragment
fn fragmentMain(input : FragmentInput) -> FragmentOutput {
var output: FragmentOutput;
output.color = float2vec4(vLinearDepth);
var linear : vec3f;
var dir : vec3f;
let ndc : vec2f = input.vClipXYW.xy / input.vClipXYW.z;
let px : f32 = ndc.x / uniform.fisheye_projMat00;
let py : f32 = ndc.y / uniform.fisheye_projMat11;
let r : f32 = sqrt(px * px + py * py);
let theta : f32 = uniform.fisheye_k * atan(r * uniform.fisheye_invK);
let sinT : f32 = sin(theta);
let cosT : f32 = cos(theta);
var camDir : vec3f;
if (r > 1e-6) {
camDir = vec3f(px / r * sinT, py / r * sinT, -cosT);
} else {
camDir = vec3f(0.0, 0.0, -1.0);
}
let viewMat3 : mat3x3f = mat3x3f(
uniform.matrix_view[0].xyz,
uniform.matrix_view[1].xyz,
uniform.matrix_view[2].xyz
);
dir = transpose(viewMat3) * camDir;
dir = dir * uniform.cubeMapRotationMatrix;
var envDir : vec3f = normalize(input.vWorldPos - uniform.projectedSkydomeCenter);
dir = envDir * uniform.cubeMapRotationMatrix;
dir = input.vViewDir;
dir.x *= -1.0;
linear = {SKYBOX_DECODE_FNC}(textureSample(texture_cubeMap, texture_cubeMap_sampler, dir));
dir *= vec3f(-1.0, 1.0, 1.0);
let uv : vec2f = toSphericalUv(normalize(dir));
linear = {SKYBOX_DECODE_FNC}(textureSample(texture_envAtlas, texture_envAtlas_sampler, mapRoughnessUv(uv, uniform.mipLevel)));
if (any(linear >= vec3f(64.0))) {
linear *= uniform.skyboxHighlightMultiplier;
}
output.color = vec4f(gammaCorrectOutput(toneMap(processEnvironment(linear))), 1.0);
return output;
}
`;
export {
skybox_default as default
};