playcanvas
Version:
PlayCanvas WebGL game engine
4 lines (2 loc) • 2.05 kB
JavaScript
var gsplatCornerVS = "\nuniform vec2 viewport; // viewport dimensions\nuniform vec4 camera_params; // 1 / far, far, near, isOrtho\n\n// calculate the clip-space offset from the center for this gaussian\nbool initCorner(SplatSource source, SplatCenter center, out SplatCorner corner) {\n // get covariance\n vec3 covA, covB;\n readCovariance(source, covA, covB);\n\n mat3 Vrk = mat3(\n covA.x, covA.y, covA.z, \n covA.y, covB.x, covB.y,\n covA.z, covB.y, covB.z\n );\n\n float focal = viewport.x * center.projMat00;\n\n vec3 v = camera_params.w == 1.0 ? vec3(0.0, 0.0, 1.0) : center.view.xyz;\n float J1 = focal / v.z;\n vec2 J2 = -J1 / v.z * v.xy;\n mat3 J = mat3(\n J1, 0.0, J2.x, \n 0.0, J1, J2.y, \n 0.0, 0.0, 0.0\n );\n\n mat3 W = transpose(mat3(center.modelView));\n mat3 T = W * J;\n mat3 cov = transpose(T) * Vrk * T;\n\n float diagonal1 = cov[0][0] + 0.3;\n float offDiagonal = cov[0][1];\n float diagonal2 = cov[1][1] + 0.3;\n\n float mid = 0.5 * (diagonal1 + diagonal2);\n float radius = length(vec2((diagonal1 - diagonal2) / 2.0, offDiagonal));\n float lambda1 = mid + radius;\n float lambda2 = max(mid - radius, 0.1);\n\n float l1 = 2.0 * min(sqrt(2.0 * lambda1), 1024.0);\n float l2 = 2.0 * min(sqrt(2.0 * lambda2), 1024.0);\n\n // early-out gaussians smaller than 2 pixels\n if (l1 < 2.0 && l2 < 2.0) {\n return false;\n }\n\n vec2 c = center.proj.ww / viewport;\n\n // cull against frustum x/y axes\n if (any(greaterThan(abs(center.proj.xy) - vec2(max(l1, l2)) * c, center.proj.ww))) {\n return false;\n }\n\n vec2 diagonalVector = normalize(vec2(offDiagonal, lambda1 - diagonal1));\n vec2 v1 = l1 * diagonalVector;\n vec2 v2 = l2 * vec2(diagonalVector.y, -diagonalVector.x);\n\n corner.offset = (source.cornerUV.x * v1 + source.cornerUV.y * v2) * c;\n corner.uv = source.cornerUV;\n\n return true;\n}\n";
export { gsplatCornerVS as default };