subSurfaceScatteringPostProcess.ts 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { Nullable } from "../types";
  2. import { Camera } from "../Cameras/camera";
  3. import { Effect } from "../Materials/effect";
  4. import { Texture } from "../Materials/Textures/texture";
  5. import { PostProcess, PostProcessOptions } from "./postProcess";
  6. import { Engine } from "../Engines/engine";
  7. import { Scene } from "../scene";
  8. import { Constants } from "../Engines/constants";
  9. import { Logger } from "../Misc/logger";
  10. import "../Shaders/imageProcessing.fragment";
  11. import "../Shaders/subSurfaceScattering.fragment";
  12. import "../Shaders/postprocess.vertex";
  13. /**
  14. * Sub surface scattering post process
  15. */
  16. export class SubSurfaceScatteringPostProcess extends PostProcess {
  17. /**
  18. * Gets a string identifying the name of the class
  19. * @returns "SubSurfaceScatteringPostProcess" string
  20. */
  21. public getClassName(): string {
  22. return "SubSurfaceScatteringPostProcess";
  23. }
  24. constructor(name: string, scene: Scene, options: number | PostProcessOptions, camera: Nullable<Camera> = null, samplingMode?: number, engine?: Engine, reusable?: boolean, textureType: number = Constants.TEXTURETYPE_UNSIGNED_INT) {
  25. 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);
  26. this._scene = scene;
  27. this.updateEffect();
  28. this.onApplyObservable.add((effect: Effect) => {
  29. if (!scene.prePassRenderer || !scene.subSurfaceConfiguration) {
  30. Logger.Error("PrePass and subsurface configuration needs to be enabled for subsurface scattering.");
  31. return;
  32. }
  33. var texelSize = this.texelSize;
  34. effect.setFloat("metersPerUnit", scene.subSurfaceConfiguration.metersPerUnit);
  35. effect.setFloat2("texelSize", texelSize.x, texelSize.y);
  36. effect.setTexture("irradianceSampler", scene.prePassRenderer.prePassRT.textures[scene.prePassRenderer.getIndex(Constants.PREPASS_IRRADIANCE_TEXTURE_TYPE)]);
  37. effect.setTexture("depthSampler", scene.prePassRenderer.prePassRT.textures[scene.prePassRenderer.getIndex(Constants.PREPASS_DEPTHNORMAL_TEXTURE_TYPE)]);
  38. effect.setTexture("albedoSampler", scene.prePassRenderer.prePassRT.textures[scene.prePassRenderer.getIndex(Constants.PREPASS_ALBEDO_TEXTURE_TYPE)]);
  39. effect.setFloat2("viewportSize",
  40. Math.tan(scene.activeCamera!.fov / 2) * scene.getEngine().getAspectRatio(scene.activeCamera!, true),
  41. Math.tan(scene.activeCamera!.fov / 2));
  42. effect.setArray3("diffusionS", scene.subSurfaceConfiguration.ssDiffusionS);
  43. effect.setArray("diffusionD", scene.subSurfaceConfiguration.ssDiffusionD);
  44. effect.setArray("filterRadii", scene.subSurfaceConfiguration.ssFilterRadii);
  45. });
  46. }
  47. }