playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
74 lines (73 loc) • 2.12 kB
JavaScript
var sog_default = `
uniform means_mins: vec3f;
uniform means_maxs: vec3f;
uniform scales_mins: vec3f;
uniform scales_maxs: vec3f;
uniform sh0_mins: vec4f;
uniform sh0_maxs: vec4f;
const SH_C0: f32 = 0.28209479177387814;
const norm: f32 = sqrt(2.0);
fn lutScales(b: i32) -> f32 { return textureLoad(sogCodebook, vec2i(b, 0), 0).r; }
fn lutSh0(b: i32) -> f32 { return textureLoad(sogCodebook, vec2i(b, 0), 0).g; }
fn lutShN(b: i32) -> f32 { return textureLoad(sogCodebook, vec2i(b, 0), 0).b; }
fn getCenter() -> vec3f {
let l = textureLoad(means_l, splat.uv, 0).xyz;
let u = textureLoad(means_u, splat.uv, 0).xyz;
let n = (l + u * 256.0) / 257.0;
let v = mix(uniform.means_mins, uniform.means_maxs, n);
return sign(v) * (exp(abs(v)) - 1.0);
}
fn getRotation() -> vec4f {
let q = textureLoad(quats, splat.uv, 0);
let qmode = u32(q.w * 255.0 + 0.5) - 252u;
let abc = (q.xyz - 0.5) * norm;
let d = sqrt(max(0.0, 1.0 - dot(abc, abc)));
var quat: vec4f;
if (qmode == 0u) {
quat = vec4f(d, abc);
} else if (qmode == 1u) {
quat = vec4f(abc.x, d, abc.y, abc.z);
} else if (qmode == 2u) {
quat = vec4f(abc.x, abc.y, d, abc.z);
} else {
quat = vec4f(abc.x, abc.y, abc.z, d);
}
return quat;
}
fn getScale() -> vec3f {
let s = textureLoad(scales, splat.uv, 0).xyz;
var logS: vec3f;
let i = vec3i(s * 255.0 + 0.5);
logS = vec3f(lutScales(i.x), lutScales(i.y), lutScales(i.z));
logS = mix(uniform.scales_mins, uniform.scales_maxs, s);
return exp(logS);
}
fn getColor() -> vec4f {
let c = textureLoad(sh0, splat.uv, 0);
var rgb: vec3f;
var alpha: f32;
let i = vec3i(c.xyz * 255.0 + 0.5);
rgb = vec3f(lutSh0(i.x), lutSh0(i.y), lutSh0(i.z));
alpha = c.w;
rgb = mix(uniform.sh0_mins.xyz, uniform.sh0_maxs.xyz, c.xyz);
let logitAlpha = mix(uniform.sh0_mins.w, uniform.sh0_maxs.w, c.w);
alpha = 1.0 / (1.0 + exp(-logitAlpha));
return vec4f(vec3f(0.5) + rgb * SH_C0, alpha);
}
`;
export {
sog_default as default
};