gaussianSplatting.vertex.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Do not edit.
  2. import { ShaderStore } from "../Engines/shaderStore.js";
  3. import "./ShadersInclude/gaussianSplattingVertexDeclaration.js";
  4. import "./ShadersInclude/gaussianSplattingUboDeclaration.js";
  5. import "./ShadersInclude/clipPlaneVertexDeclaration.js";
  6. import "./ShadersInclude/fogVertexDeclaration.js";
  7. import "./ShadersInclude/logDepthDeclaration.js";
  8. import "./ShadersInclude/clipPlaneVertex.js";
  9. import "./ShadersInclude/fogVertex.js";
  10. import "./ShadersInclude/logDepthVertex.js";
  11. const name = "gaussianSplattingVertexShader";
  12. const shader = `#include<__decl__gaussianSplattingVertex>
  13. #ifdef LOGARITHMICDEPTH
  14. #extension GL_EXT_frag_depth : enable
  15. #endif
  16. #include<clipPlaneVertexDeclaration>
  17. #include<fogVertexDeclaration>
  18. #include<logDepthDeclaration>
  19. attribute vec2 position;attribute float splatIndex;uniform vec2 viewport;uniform vec2 dataTextureSize;uniform vec2 focal;uniform sampler2D covariancesATexture;uniform sampler2D covariancesBTexture;uniform sampler2D centersTexture;uniform sampler2D colorsTexture;varying vec4 vColor;varying vec2 vPosition;
  20. #if !defined(WEBGL2) && !defined(WEBGPU) && !defined(NATIVE)
  21. mat3 transpose(mat3 matrix) {return mat3(matrix[0][0],matrix[1][0],matrix[2][0],
  22. matrix[0][1],matrix[1][1],matrix[2][1],
  23. matrix[0][2],matrix[1][2],matrix[2][2]);}
  24. #endif
  25. vec2 getDataUV(float index,vec2 textureSize) {float y=floor(index/textureSize.x);float x=index-y*textureSize.x;return vec2((x+0.5)/textureSize.x,(y+0.5)/textureSize.y);}
  26. void main () {vec2 splatUV=getDataUV(splatIndex,dataTextureSize);vec3 center=texture2D(centersTexture,splatUV).xyz;vec4 color=texture2D(colorsTexture,splatUV);vec3 covA=texture2D(covariancesATexture,splatUV).xyz;vec3 covB=texture2D(covariancesBTexture,splatUV).xyz;vec4 worldPos=world*vec4(center,1.0);mat4 modelView=view*world;vec4 camspace=view*worldPos;vec4 pos2d=projection*camspace;float bounds=1.2*pos2d.w;if (pos2d.z<-pos2d.w || pos2d.x<-bounds || pos2d.x>bounds
  27. || pos2d.y<-bounds || pos2d.y>bounds) {gl_Position=vec4(0.0,0.0,2.0,1.0);return;}
  28. mat3 Vrk=mat3(
  29. covA.x,covA.y,covA.z,
  30. covA.y,covB.x,covB.y,
  31. covA.z,covB.y,covB.z
  32. );mat3 J=mat3(
  33. focal.x/camspace.z,0.,-(focal.x*camspace.x)/(camspace.z*camspace.z),
  34. 0.,focal.y/camspace.z,-(focal.y*camspace.y)/(camspace.z*camspace.z),
  35. 0.,0.,0.
  36. );mat3 invy=mat3(1,0,0,0,-1,0,0,0,1);mat3 T=invy*transpose(mat3(modelView))*J;mat3 cov2d=transpose(T)*Vrk*T;float mid=(cov2d[0][0]+cov2d[1][1])/2.0;float radius=length(vec2((cov2d[0][0]-cov2d[1][1])/2.0,cov2d[0][1]));float lambda1=mid+radius,lambda2=mid-radius;if (lambda2<0.0) return;vec2 diagonalVector=normalize(vec2(cov2d[0][1],lambda1-cov2d[0][0]));vec2 majorAxis=min(sqrt(2.0*lambda1),1024.0)*diagonalVector;vec2 minorAxis=min(sqrt(2.0*lambda2),1024.0)*vec2(diagonalVector.y,-diagonalVector.x);vColor=color;vPosition=position;vec2 vCenter=vec2(pos2d);gl_Position=vec4(
  37. vCenter
  38. + (position.x*majorAxis*1./viewport
  39. + position.y*minorAxis*1./viewport)*pos2d.w,pos2d.zw);
  40. #include<clipPlaneVertex>
  41. #include<fogVertex>
  42. #include<logDepthVertex>
  43. }
  44. `;
  45. // Sideeffect
  46. ShaderStore.ShadersStore[name] = shader;
  47. /** @internal */
  48. export const gaussianSplattingVertexShader = { name, shader };
  49. //# sourceMappingURL=gaussianSplatting.vertex.js.map