subSurfaceScatteringPostProcess.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { Texture } from "../Materials/Textures/texture.js";
  2. import { PostProcess } from "./postProcess.js";
  3. import { Logger } from "../Misc/logger.js";
  4. import "../Shaders/imageProcessing.fragment.js";
  5. import "../Shaders/subSurfaceScattering.fragment.js";
  6. import "../Shaders/postprocess.vertex.js";
  7. /**
  8. * Sub surface scattering post process
  9. */
  10. export class SubSurfaceScatteringPostProcess extends PostProcess {
  11. /**
  12. * Gets a string identifying the name of the class
  13. * @returns "SubSurfaceScatteringPostProcess" string
  14. */
  15. getClassName() {
  16. return "SubSurfaceScatteringPostProcess";
  17. }
  18. constructor(name, scene, options, camera = null, samplingMode, engine, reusable, textureType = 0) {
  19. super(name, "subSurfaceScattering", ["texelSize", "viewportSize", "metersPerUnit"], ["diffusionS", "diffusionD", "filterRadii", "irradianceSampler", "depthSampler", "albedoSampler"], options, camera, samplingMode || Texture.BILINEAR_SAMPLINGMODE, engine, reusable, null, textureType, "postprocess", undefined, true);
  20. this._scene = scene;
  21. this.updateEffect();
  22. this.onApplyObservable.add((effect) => {
  23. if (!scene.prePassRenderer || !scene.subSurfaceConfiguration) {
  24. Logger.Error("PrePass and subsurface configuration needs to be enabled for subsurface scattering.");
  25. return;
  26. }
  27. const texelSize = this.texelSize;
  28. effect.setFloat("metersPerUnit", scene.subSurfaceConfiguration.metersPerUnit);
  29. effect.setFloat2("texelSize", texelSize.x, texelSize.y);
  30. effect.setTexture("irradianceSampler", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(0)]);
  31. effect.setTexture("depthSampler", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(5)]);
  32. effect.setTexture("albedoSampler", scene.prePassRenderer.getRenderTarget().textures[scene.prePassRenderer.getIndex(7)]);
  33. effect.setFloat2("viewportSize", Math.tan(scene.activeCamera.fov / 2) * scene.getEngine().getAspectRatio(scene.activeCamera, true), Math.tan(scene.activeCamera.fov / 2));
  34. effect.setArray3("diffusionS", scene.subSurfaceConfiguration.ssDiffusionS);
  35. effect.setArray("diffusionD", scene.subSurfaceConfiguration.ssDiffusionD);
  36. effect.setArray("filterRadii", scene.subSurfaceConfiguration.ssFilterRadii);
  37. });
  38. }
  39. }
  40. //# sourceMappingURL=subSurfaceScatteringPostProcess.js.map