@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 2.71 kB
JavaScript
import{CULLFACE_NONE as t}from"../../platform/graphics/constants.js";import{ShaderProcessorOptions as e}from"../../platform/graphics/shader-processor-options.js";import{DITHER_NONE as o,BLEND_NONE as r,BLEND_NORMAL as n,SHADER_FORWARDHDR as a,GAMMA_SRGBHDR as i,GAMMA_NONE as l,TONEMAP_LINEAR as c}from"../constants.js";import{Material as s}from"../materials/material.js";import{getProgramLibrary as v}from"../shader-lib/get-program-library.js";import{gsplat as p}from"./shader-generator-gsplat.js";const m=(m={})=>{var d;const _=null!=(d=m.dither)?d:o,g=_!==o,f=new s;return f.name="splatMaterial",f.cull=t,f.blendType=g?r:n,f.depthWrite=g,f.getShaderVariant=function(t,o,r,n,s,d,g,f){var x,w;const u={pass:s,gamma:s===a?o.gammaCorrection?i:l:o.gammaCorrection,toneMapping:s===a?c:o.toneMapping,vertex:null!=(x=m.vertex)?x:"\n\tuniform vec3 view_position;\n\tuniform sampler2D splatColor;\n\tvarying mediump vec2 texCoord;\n\tvarying mediump vec4 color;\n\tmediump vec4 discardVec = vec4(0.0, 0.0, 2.0, 1.0);\n\tvoid main(void)\n\t{\n\t\tif (!calcSplatUV()) {\n\t\t\tgl_Position = discardVec;\n\t\t\treturn;\n\t\t}\n\t\tvec3 center = getCenter();\n\t\tmat4 model_view = matrix_view * matrix_model;\n\t\tvec4 splat_cam = model_view * vec4(center, 1.0);\n\t\tif (splat_cam.z > 0.0) {\n\t\t\tgl_Position = discardVec;\n\t\t\treturn;\n\t\t}\n\t\tvec4 splat_proj = matrix_projection * splat_cam;\n\t\tsplat_proj.z = clamp(splat_proj.z, -abs(splat_proj.w), abs(splat_proj.w));\n\t\tvec3 covA, covB;\n\t\tgetCovariance(covA, covB);\n\t\tvec4 v1v2 = calcV1V2(splat_cam.xyz, covA, covB, transpose(mat3(model_view)));\n\t\tcolor = texelFetch(splatColor, splatUV, 0);\n\t\tfloat scale = min(1.0, sqrt(-log(1.0 / 255.0 / color.a)) / 2.0);\n\t\tv1v2 *= scale;\n\t\tif (dot(v1v2.xy, v1v2.xy) < 4.0 && dot(v1v2.zw, v1v2.zw) < 4.0) {\n\t\t\tgl_Position = discardVec;\n\t\t\treturn;\n\t\t}\n\t\tgl_Position = splat_proj + vec4((vertex_position.x * v1v2.xy + vertex_position.y * v1v2.zw) / viewport * splat_proj.w, 0, 0);\n\t\ttexCoord = vertex_position.xy * scale / 2.0;\n\t\t#ifdef USE_SH1\n\t\t\tvec4 worldCenter = matrix_model * vec4(center, 1.0);\n\t\t\tvec3 viewDir = normalize((worldCenter.xyz / worldCenter.w - view_position) * mat3(matrix_model));\n\t\t\tcolor.xyz = max(color.xyz + evalSH(viewDir), 0.0);\n\t\t#endif\n\t\t#ifndef DITHER_NONE\n\t\t\tid = float(splatId);\n\t\t#endif\n\t}\n",fragment:null!=(w=m.fragment)?w:"\n\tvarying mediump vec2 texCoord;\n\tvarying mediump vec4 color;\n\tvoid main(void)\n\t{\n\t\tgl_FragColor = evalSplat(texCoord, color);\n\t}\n",dither:_,defines:m.defines},y=new e(g,f),j=v(t);return j.register("splat",p),j.getProgram("splat",u,y)},f.update(),f};export{m as createGSplatMaterial};