rsmFullGlobalIllumination.fragment.js 1.7 KB

12345678910111213141516171819202122232425262728
  1. // Do not edit.
  2. import { ShaderStore } from "../Engines/shaderStore.js";
  3. const name = "rsmFullGlobalIlluminationPixelShader";
  4. const shader = `/**
  5. * The implementation is a direct application of the formula found in http:
  6. */
  7. precision highp float;varying vec2 vUV;uniform mat4 rsmLightMatrix;uniform vec4 rsmInfo;uniform sampler2D textureSampler;uniform sampler2D normalSampler;uniform sampler2D rsmPositionW;uniform sampler2D rsmNormalW;uniform sampler2D rsmFlux;
  8. #ifdef TRANSFORM_NORMAL
  9. uniform mat4 invView;
  10. #endif
  11. vec3 computeIndirect(vec3 p,vec3 n) {vec3 indirectDiffuse=vec3(0.);float intensity=rsmInfo.z;float edgeArtifactCorrection=rsmInfo.w;vec4 texRSM=rsmLightMatrix*vec4(p,1.);texRSM.xy/=texRSM.w;texRSM.xy=texRSM.xy*0.5+0.5;int width=int(rsmInfo.x);int height=int(rsmInfo.y);for (int j=0; j<height; j++) {for (int i=0; i<width; i++) {ivec2 uv=ivec2(i,j);vec3 vplPositionW=texelFetch(rsmPositionW,uv,0).xyz;vec3 vplNormalW=texelFetch(rsmNormalW,uv,0).xyz*2.0-1.0;vec3 vplFlux=texelFetch(rsmFlux,uv,0).rgb;vplPositionW-=vplNormalW*edgeArtifactCorrection;
  12. float dist2=dot(vplPositionW-p,vplPositionW-p);indirectDiffuse+=vplFlux*max(0.,dot(n,vplPositionW-p))*max(0.,dot(vplNormalW,p-vplPositionW))/(dist2*dist2);}}
  13. return clamp(indirectDiffuse*intensity,0.0,1.0);}
  14. void main(void)
  15. {vec3 positionW=texture2D(textureSampler,vUV).xyz;vec3 normalW=texture2D(normalSampler,vUV).xyz;
  16. #ifdef DECODE_NORMAL
  17. normalW=normalW*2.0-1.0;
  18. #endif
  19. #ifdef TRANSFORM_NORMAL
  20. normalW=(invView*vec4(normalW,0.)).xyz;
  21. #endif
  22. gl_FragColor.rgb=computeIndirect(positionW,normalW);gl_FragColor.a=1.0;}
  23. `;
  24. // Sideeffect
  25. ShaderStore.ShadersStore[name] = shader;
  26. /** @internal */
  27. export const rsmFullGlobalIlluminationPixelShader = { name, shader };
  28. //# sourceMappingURL=rsmFullGlobalIllumination.fragment.js.map