playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
88 lines (73 loc) • 3.28 kB
JavaScript
var wgslGsplatSogReorderPS = /* wgsl */ `
#include "gsplatPackingPS"
var means_l: texture_2d<f32>;
var means_u: texture_2d<f32>;
var quats: texture_2d<f32>;
var scales: texture_2d<f32>;
var sh0: texture_2d<f32>;
var sh_labels: texture_2d<f32>;
uniform numSplats: u32;
#ifdef REORDER_V1
fn sigmoid(x: f32) -> f32 { return 1.0 / (1.0 + exp(-x)); }
fn vmin(v: vec3f) -> vec3f { return vec3f(min(min(v.x, v.y), v.z)); }
fn vmax(v: vec3f) -> vec3f { return vec3f(max(max(v.x, v.y), v.z)); }
fn resolve(m: vec3f, M: vec3f, v: vec3f) -> vec3f { return (mix(m, M, v) - vmin(m)) / (vmax(M) - vmin(m)); }
uniform scalesMins: vec3f;
uniform scalesMaxs: vec3f;
uniform sh0Mins: vec4f;
uniform sh0Maxs: vec4f;
#else
uniform scales_codebook: array<vec4f, 64>;
uniform sh0_codebook: array<vec4f, 64>;
#endif
@fragment
fn fragmentMain(input: FragmentInput) -> FragmentOutput {
var output: FragmentOutput;
let w: u32 = textureDimensions(means_l, 0).x;
let uv: vec2<u32> = vec2<u32>(input.position.xy);
if (uv.x + uv.y * w >= uniform.numSplats) {
discard;
return output;
}
// fetch the source index and calculate source uv
let meansLSample: vec3<f32> = textureLoad(means_l, uv, 0).xyz;
let meansUSample: vec3<f32> = textureLoad(means_u, uv, 0).xyz;
let quatsSample: vec4<f32> = textureLoad(quats, uv, 0);
let scalesSample: vec3<f32> = textureLoad(scales, uv, 0).xyz;
let sh0Sample: vec4f = textureLoad(sh0, uv, 0);
let shLabelsSample: vec2<f32> = textureLoad(sh_labels, uv, 0).xy;
#ifdef REORDER_V1
let scale = pack101010(resolve(uniform.scalesMins, uniform.scalesMaxs, scalesSample));
let sh0 = pack111110(resolve(uniform.sh0Mins.xyz, uniform.sh0Maxs.xyz, sh0Sample.xyz));
let alpha = sigmoid(mix(uniform.sh0Mins.w, uniform.sh0Maxs.w, sh0Sample.w));
#else
// resolve scale codebook to 10,10,10 bits
let scalesIdx = vec3u(scalesSample * 255.0);
let scalesV = vec3f(
uniform.scales_codebook[scalesIdx.x >> 2u][scalesIdx.x & 3u],
uniform.scales_codebook[scalesIdx.y >> 2u][scalesIdx.y & 3u],
uniform.scales_codebook[scalesIdx.z >> 2u][scalesIdx.z & 3u]
);
let scale = pack101010((scalesV - uniform.scales_codebook[0].x) / (uniform.scales_codebook[63].w - uniform.scales_codebook[0].x));
// resolve sh0 codebook to 11,11,10 bits
let sh0Idx = vec3u(sh0Sample.xyz * 255.0);
let sh0V = vec3f(
uniform.sh0_codebook[sh0Idx.x >> 2u][sh0Idx.x & 3u],
uniform.sh0_codebook[sh0Idx.y >> 2u][sh0Idx.y & 3u],
uniform.sh0_codebook[sh0Idx.z >> 2u][sh0Idx.z & 3u]
);
let sh0 = pack111110((sh0V - uniform.sh0_codebook[0].x) / (uniform.sh0_codebook[63].w - uniform.sh0_codebook[0].x));
let alpha = sh0Sample.w;
#endif
let qmode = u32(quatsSample.w * 255.0) - 252u;
output.color = vec4u(
pack8888(vec4f(meansLSample, shLabelsSample.x)),
pack8888(vec4f(meansUSample, shLabelsSample.y)),
pack8888(vec4f(quatsSample.xyz, alpha)),
(scale << 2u) | qmode
);
output.color1 = unpack8888(sh0);
return output;
}
`;
export { wgslGsplatSogReorderPS as default };