Skip to content

Commit

Permalink
latest
Browse files Browse the repository at this point in the history
  • Loading branch information
slimbuck committed Dec 4, 2024
1 parent a165107 commit 2863700
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 45 deletions.
5 changes: 3 additions & 2 deletions src/scene/shader-lib/chunks/gsplat/vert/gsplatCommon.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ vec3 evalSH(in SplatState state, in ProjectedState projState) {
// read sh coefficients
vec3 sh[SH_COEFFS];
readSHData(state, sh);
float scale;
readSHData(state, sh, scale);
// calculate the model-space view direction
vec3 dir = normalize(projState.centerCam * mat3(projState.modelView));
Expand Down Expand Up @@ -217,7 +218,7 @@ vec3 evalSH(in SplatState state, in ProjectedState projState) {
sh[14] * (SH_C3_6 * x * (xx - 3.0 * yy));
#endif
return result;
return result * scale;
}
#endif
`;
30 changes: 16 additions & 14 deletions src/scene/shader-lib/chunks/gsplat/vert/gsplatCompressedSH.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,30 @@ uniform highp usampler2D shTexture0;
uniform highp usampler2D shTexture1;
uniform highp usampler2D shTexture2;
vec4 sunpack8888(in uint bits) {
vec4 unpack8888s(in uint bits) {
return vec4((uvec4(bits) >> uvec4(0u, 8u, 16u, 24u)) & 0xffu) * (8.0 / 255.0) - 4.0;
}
void readSHData(in SplatState state, out vec3 sh[15]) {
void readSHData(in SplatState state, out vec3 sh[15], out float scale) {
// read the sh coefficients
uvec4 shData0 = texelFetch(shTexture0, state.uv, 0);
uvec4 shData1 = texelFetch(shTexture1, state.uv, 0);
uvec4 shData2 = texelFetch(shTexture2, state.uv, 0);
vec4 r0 = sunpack8888(shData0.x);
vec4 r1 = sunpack8888(shData0.y);
vec4 r2 = sunpack8888(shData0.z);
vec4 r3 = sunpack8888(shData0.w);
vec4 r0 = unpack8888s(shData0.x);
vec4 r1 = unpack8888s(shData0.y);
vec4 r2 = unpack8888s(shData0.z);
vec4 r3 = unpack8888s(shData0.w);
vec4 g0 = sunpack8888(shData1.x);
vec4 g1 = sunpack8888(shData1.y);
vec4 g2 = sunpack8888(shData1.z);
vec4 g3 = sunpack8888(shData1.w);
vec4 g0 = unpack8888s(shData1.x);
vec4 g1 = unpack8888s(shData1.y);
vec4 g2 = unpack8888s(shData1.z);
vec4 g3 = unpack8888s(shData1.w);
vec4 b0 = sunpack8888(shData2.x);
vec4 b1 = sunpack8888(shData2.y);
vec4 b2 = sunpack8888(shData2.z);
vec4 b3 = sunpack8888(shData2.w);
vec4 b0 = unpack8888s(shData2.x);
vec4 b1 = unpack8888s(shData2.y);
vec4 b2 = unpack8888s(shData2.z);
vec4 b3 = unpack8888s(shData2.w);
sh[0] = vec3(r0.x, g0.x, b0.x);
sh[1] = vec3(r0.y, g0.y, b0.y);
Expand All @@ -45,6 +45,8 @@ void readSHData(in SplatState state, out vec3 sh[15]) {
sh[12] = vec3(r3.x, g3.x, b3.x);
sh[13] = vec3(r3.y, g3.y, b3.y);
sh[14] = vec3(r3.z, g3.z, b3.z);
scale = 1.0;
}
#endif
Expand Down
43 changes: 14 additions & 29 deletions src/scene/shader-lib/chunks/gsplat/vert/gsplatSH.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,70 +2,55 @@ export default /* glsl */`
#if SH_BANDS > 0
vec3 unpack111011(uint bits) {
return vec3(
float(bits >> 21u) / 2047.0,
float((bits >> 11u) & 0x3ffu) / 1023.0,
float(bits & 0x7ffu) / 2047.0
);
// unpack signed 11 10 11 bits
vec3 unpack111011s(uint bits) {
return vec3((uvec3(bits) >> uvec3(21u, 11u, 0u)) & uvec3(0x7ffu, 0x3ffu, 0x7ffu)) / vec3(2047.0, 1023.0, 2047.0) * 2.0 - 1.0;
}
// fetch quantized spherical harmonic coefficients
void fetchScale(in uvec4 t, out float scale, out vec3 a, out vec3 b, out vec3 c) {
scale = uintBitsToFloat(t.x);
a = unpack111011(t.y) * 2.0 - 1.0;
b = unpack111011(t.z) * 2.0 - 1.0;
c = unpack111011(t.w) * 2.0 - 1.0;
a = unpack111011s(t.y);
b = unpack111011s(t.z);
c = unpack111011s(t.w);
}
// fetch quantized spherical harmonic coefficients
void fetch(in uvec4 t, out vec3 a, out vec3 b, out vec3 c, out vec3 d) {
a = unpack111011(t.x) * 2.0 - 1.0;
b = unpack111011(t.y) * 2.0 - 1.0;
c = unpack111011(t.z) * 2.0 - 1.0;
d = unpack111011(t.w) * 2.0 - 1.0;
a = unpack111011s(t.x);
b = unpack111011s(t.y);
c = unpack111011s(t.z);
d = unpack111011s(t.w);
}
void fetch(in uint t, out vec3 a) {
a = unpack111011(t) * 2.0 - 1.0;
a = unpack111011s(t);
}
#if SH_BANDS == 1
uniform highp usampler2D splatSH_1to3;
void readSHData(in SplatState state, out vec3 sh[3]) {
float scale;
void readSHData(in SplatState state, out vec3 sh[3], out float scale) {
fetchScale(texelFetch(splatSH_1to3, state.uv, 0), scale, sh[0], sh[1], sh[2]);
for (int i = 0; i < 3; i++) {
sh[i] *= scale;
}
}
#elif SH_BANDS == 2
uniform highp usampler2D splatSH_1to3;
uniform highp usampler2D splatSH_4to7;
uniform highp usampler2D splatSH_8to11;
void readSHData(in SplatState state, out vec3 sh[8]) {
float scale;
void readSHData(in SplatState state, out vec3 sh[8], out float scale) {
fetchScale(texelFetch(splatSH_1to3, state.uv, 0), scale, sh[0], sh[1], sh[2]);
fetch(texelFetch(splatSH_4to7, state.uv, 0), sh[3], sh[4], sh[5], sh[6]);
fetch(texelFetch(splatSH_8to11, state.uv, 0).x, sh[7]);
for (int i = 0; i < 8; i++) {
sh[i] *= scale;
}
}
#else
uniform highp usampler2D splatSH_1to3;
uniform highp usampler2D splatSH_4to7;
uniform highp usampler2D splatSH_8to11;
uniform highp usampler2D splatSH_12to15;
void readSHData(in SplatState state, out vec3 sh[15]) {
float scale;
void readSHData(in SplatState state, out vec3 sh[15], out float scale) {
fetchScale(texelFetch(splatSH_1to3, state.uv, 0), scale, sh[0], sh[1], sh[2]);
fetch(texelFetch(splatSH_4to7, state.uv, 0), sh[3], sh[4], sh[5], sh[6]);
fetch(texelFetch(splatSH_8to11, state.uv, 0), sh[7], sh[8], sh[9], sh[10]);
fetch(texelFetch(splatSH_12to15, state.uv, 0), sh[11], sh[12], sh[13], sh[14]);
for (int i = 0; i < 15; i++) {
sh[i] *= scale;
}
}
#endif
Expand Down

0 comments on commit 2863700

Please sign in to comment.