UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 7.25 kB
import{hashCode as t}from"../../core/hash.js";import{SEMANTIC_POSITION as n,SEMANTIC_ATTR13 as e}from"../../platform/graphics/constants.js";import{ShaderUtils as a}from"../../platform/graphics/shader-utils.js";import{TONEMAP_LINEAR as i,DITHER_NONE as o}from"../constants.js";import{shaderChunks as r}from"../shader-lib/chunks/chunks.js";import{ShaderGenerator as s}from"../shader-lib/programs/shader-generator.js";import{ShaderPass as f}from"../shader-pass.js";const c=new class{generateKey(n){var e,a;const i=t(n.vertex),o=t(n.fragment),r=null!=(e=null==(a=n.defines)?void 0:a.sort().join("-"))?e:"";return`splat-${n.pass}-${n.gamma}-${n.toneMapping}-${i}-${o}-${n.dither}-${r}`}createShaderDefinition(t,c){var d;const l=`${f.get(t).getByIndex(c.pass).shaderDefines}\n${(null!=(d=c.defines)?d:[]).map((t=>`#define ${t}`)).join("\n")}\n#define DITHER_${c.dither.toUpperCase()}\n#define TONEMAP_${c.toneMapping===i?"DISABLED":"ENABLED"}\n`,p=l+"\n\tuniform mat4 matrix_model;\n\tuniform mat4 matrix_view;\n\tuniform mat4 matrix_projection;\n\tuniform vec2 viewport;\n\tuniform vec4 tex_params;\n\tuniform highp usampler2D splatOrder;\n\tuniform highp usampler2D transformA;\n\tuniform highp sampler2D transformB;\n\tattribute vec3 vertex_position;\n\tattribute uint vertex_id_attrib;\n\t#ifndef DITHER_NONE\n\t\tvarying float id;\n\t#endif\n\tuint orderId;\n\tuint splatId;\n\tivec2 splatUV;\n\tbool calcSplatUV() {\n\t\tuint numSplats = uint(tex_params.x);\n\t\tuint textureWidth = uint(tex_params.y);\n\t\torderId = vertex_id_attrib + uint(vertex_position.z);\n\t\tif (orderId >= numSplats) {\n\t\t\treturn false;\n\t\t}\n\t\tivec2 orderUV = ivec2(\n\t\t\tint(orderId % textureWidth),\n\t\t\tint(orderId / textureWidth)\n\t\t);\n\t\tsplatId = texelFetch(splatOrder, orderUV, 0).r;\n\t\tsplatUV = ivec2(\n\t\t\tint(splatId % textureWidth),\n\t\t\tint(splatId / textureWidth)\n\t\t);\n\t\treturn true;\n\t}\n\tuvec4 tA;\n\tvec3 getCenter() {\n\t\ttA = texelFetch(transformA, splatUV, 0);\n\t\treturn uintBitsToFloat(tA.xyz);\n\t}\n\tvoid getCovariance(out vec3 covA, out vec3 covB) {\n\t\tvec4 tB = texelFetch(transformB, splatUV, 0);\n\t\tvec2 tC = unpackHalf2x16(tA.w);\n\t\tcovA = tB.xyz;\n\t\tcovB = vec3(tC.x, tC.y, tB.w);\n\t}\n\tvec4 calcV1V2(in vec3 splat_cam, in vec3 covA, in vec3 covB, mat3 W) {\n\t\tmat3 Vrk = mat3(\n\t\t\tcovA.x, covA.y, covA.z, \n\t\t\tcovA.y, covB.x, covB.y,\n\t\t\tcovA.z, covB.y, covB.z\n\t\t);\n\t\tfloat focal = viewport.x * matrix_projection[0][0];\n\t\tfloat J1 = focal / splat_cam.z;\n\t\tvec2 J2 = -J1 / splat_cam.z * splat_cam.xy;\n\t\tmat3 J = mat3(\n\t\t\tJ1, 0.0, J2.x, \n\t\t\t0.0, J1, J2.y, \n\t\t\t0.0, 0.0, 0.0\n\t\t);\n\t\tmat3 T = W * J;\n\t\tmat3 cov = transpose(T) * Vrk * T;\n\t\tfloat diagonal1 = cov[0][0] + 0.3;\n\t\tfloat offDiagonal = cov[0][1];\n\t\tfloat diagonal2 = cov[1][1] + 0.3;\n\t\tfloat mid = 0.5 * (diagonal1 + diagonal2);\n\t\tfloat radius = length(vec2((diagonal1 - diagonal2) / 2.0, offDiagonal));\n\t\tfloat lambda1 = mid + radius;\n\t\tfloat lambda2 = max(mid - radius, 0.1);\n\t\tvec2 diagonalVector = normalize(vec2(offDiagonal, lambda1 - diagonal1));\n\t\tvec2 v1 = min(sqrt(2.0 * lambda1), 1024.0) * diagonalVector;\n\t\tvec2 v2 = min(sqrt(2.0 * lambda2), 1024.0) * vec2(diagonalVector.y, -diagonalVector.x);\n\t\treturn vec4(v1, v2);\n\t}\n\tvec3 unpack111011(uint bits) {\n\t\treturn vec3(\n\t\t\tfloat(bits >> 21u) / 2047.0,\n\t\t\tfloat((bits >> 11u) & 0x3ffu) / 1023.0,\n\t\t\tfloat(bits & 0x7ffu) / 2047.0\n\t\t);\n\t}\n\tvoid fetchScale(in uvec4 t, out float scale, out vec3 a, out vec3 b, out vec3 c) {\n\t\tscale = uintBitsToFloat(t.x);\n\t\ta = unpack111011(t.y) * 2.0 - 1.0;\n\t\tb = unpack111011(t.z) * 2.0 - 1.0;\n\t\tc = unpack111011(t.w) * 2.0 - 1.0;\n\t}\n\tvoid fetch(in uvec4 t, out vec3 a, out vec3 b, out vec3 c, out vec3 d) {\n\t\ta = unpack111011(t.x) * 2.0 - 1.0;\n\t\tb = unpack111011(t.y) * 2.0 - 1.0;\n\t\tc = unpack111011(t.z) * 2.0 - 1.0;\n\t\td = unpack111011(t.w) * 2.0 - 1.0;\n\t}\n\t#if defined(USE_SH1)\n\t\t#define SH_C1 0.4886025119029199f\n\t\tuniform highp usampler2D splatSH_1to3;\n\t#if defined(USE_SH2)\n\t\t#define SH_C2_0 1.0925484305920792f\n\t\t#define SH_C2_1 -1.0925484305920792f\n\t\t#define SH_C2_2 0.31539156525252005f\n\t\t#define SH_C2_3 -1.0925484305920792f\n\t\t#define SH_C2_4 0.5462742152960396f\n\t\tuniform highp usampler2D splatSH_4to7;\n\t\tuniform highp usampler2D splatSH_8to11;\n\t#if defined(USE_SH3)\n\t\t#define SH_C3_0 -0.5900435899266435f\n\t\t#define SH_C3_1 2.890611442640554f\n\t\t#define SH_C3_2 -0.4570457994644658f\n\t\t#define SH_C3_3 0.3731763325901154f\n\t\t#define SH_C3_4 -0.4570457994644658f\n\t\t#define SH_C3_5 1.445305721320277f\n\t\t#define SH_C3_6 -0.5900435899266435f\n\t\tuniform highp usampler2D splatSH_12to15;\n\t#endif\n\t#endif\n\t#endif\n\tvec3 evalSH(in vec3 dir) {\n\t\tvec3 result = vec3(0.0);\n\t#if defined(USE_SH1)\n\t\tfloat x = dir.x;\n\t\tfloat y = dir.y;\n\t\tfloat z = dir.z;\n\t\tfloat scale;\n\t\tvec3 sh1, sh2, sh3;\n\t\tfetchScale(texelFetch(splatSH_1to3, splatUV, 0), scale, sh1, sh2, sh3);\n\t\tresult += SH_C1 * (-sh1 * y + sh2 * z - sh3 * x);\n\t#if defined(USE_SH2)\n\t\tfloat xx = x * x;\n\t\tfloat yy = y * y;\n\t\tfloat zz = z * z;\n\t\tfloat xy = x * y;\n\t\tfloat yz = y * z;\n\t\tfloat xz = x * z;\n\t\tvec3 sh4, sh5, sh6, sh7;\n\t\tvec3 sh8, sh9, sh10, sh11;\n\t\tfetch(texelFetch(splatSH_4to7, splatUV, 0), sh4, sh5, sh6, sh7);\n\t\tfetch(texelFetch(splatSH_8to11, splatUV, 0), sh8, sh9, sh10, sh11);\n\t\tresult +=\n\t\t\tsh4 * (SH_C2_0 * xy) * +\n\t\t\tsh5 * (SH_C2_1 * yz) +\n\t\t\tsh6 * (SH_C2_2 * (2.0 * zz - xx - yy)) +\n\t\t\tsh7 * (SH_C2_3 * xz) +\n\t\t\tsh8 * (SH_C2_4 * (xx - yy));\n\t#if defined(USE_SH3)\n\t\tvec3 sh12, sh13, sh14, sh15;\n\t\tfetch(texelFetch(splatSH_12to15, splatUV, 0), sh12, sh13, sh14, sh15);\n\t\tresult +=\n\t\t\tsh9 * (SH_C3_0 * y * (3.0 * xx - yy)) +\n\t\t\tsh10 * (SH_C3_1 * xy * z) +\n\t\t\tsh11 * (SH_C3_2 * y * (4.0 * zz - xx - yy)) +\n\t\t\tsh12 * (SH_C3_3 * z * (2.0 * zz - 3.0 * xx - 3.0 * yy)) +\n\t\t\tsh13 * (SH_C3_4 * x * (4.0 * zz - xx - yy)) +\n\t\t\tsh14 * (SH_C3_5 * z * (xx - yy)) +\n\t\t\tsh15 * (SH_C3_6 * x * (xx - 3.0 * yy));\n\t#endif\n\t#endif\n\t\tresult *= scale;\n\t#endif\n\t\treturn result;\n\t}\n"+c.vertex,u=l+r.decodePS+(c.dither===o?"":r.bayerPS+r.opacityDitherPS)+s.tonemapCode(c.toneMapping)+s.gammaCode(c.gamma)+"\n\t#ifndef DITHER_NONE\n\t\tvarying float id;\n\t#endif\n\t#ifdef PICK_PASS\n\t\tuniform vec4 uColor;\n\t#endif\n\tvec4 evalSplat(vec2 texCoord, vec4 color) {\n\t\tmediump float A = dot(texCoord, texCoord);\n\t\tif (A > 1.0) {\n\t\t\tdiscard;\n\t\t}\n\t\tmediump float B = exp(-A * 4.0) * color.a;\n\t\tif (B < 1.0 / 255.0) {\n\t\t\tdiscard;\n\t\t}\n\t\t#ifdef PICK_PASS\n\t\t\tif (B < 0.3) {\n\t\t\t\tdiscard;\n\t\t\t}\n\t\t\treturn uColor;\n\t\t#endif\n\t\t#ifndef DITHER_NONE\n\t\t\topacityDither(B, id * 0.013);\n\t\t#endif\n\t\t#ifdef TONEMAP_ENABLED\n\t\t\treturn vec4(gammaCorrectOutput(toneMap(decodeGamma(color.rgb))), B);\n\t\t#else\n\t\t\treturn vec4(color.rgb, B);\n\t\t#endif\n\t}\n"+c.fragment;return a.createDefinition(t,{name:"SplatShader",attributes:{vertex_position:n,vertex_id_attrib:e},vertexCode:p,fragmentCode:u})}};export{c as gsplat};