@zephyr3d/scene 0.9.18 → 0.9.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/app/scriptregistry.js +124 -6
  2. package/dist/app/scriptregistry.js.map +1 -1
  3. package/dist/index.d.ts +270 -7
  4. package/dist/index.js +2 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +11 -5
  7. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  8. package/dist/material/shader/helper.js +21 -8
  9. package/dist/material/shader/helper.js.map +1 -1
  10. package/dist/material/skin.js +4 -6
  11. package/dist/material/skin.js.map +1 -1
  12. package/dist/material/water.js +1 -1
  13. package/dist/material/water.js.map +1 -1
  14. package/dist/posteffect/bloom.js +177 -29
  15. package/dist/posteffect/bloom.js.map +1 -1
  16. package/dist/posteffect/compositor.js +111 -204
  17. package/dist/posteffect/compositor.js.map +1 -1
  18. package/dist/posteffect/motionblur.js +3 -0
  19. package/dist/posteffect/motionblur.js.map +1 -1
  20. package/dist/posteffect/posteffect.js +79 -0
  21. package/dist/posteffect/posteffect.js.map +1 -1
  22. package/dist/posteffect/skinsss.js +10 -10
  23. package/dist/posteffect/skinsss.js.map +1 -1
  24. package/dist/posteffect/ssr.js +247 -16
  25. package/dist/posteffect/ssr.js.map +1 -1
  26. package/dist/posteffect/taa.js +121 -19
  27. package/dist/posteffect/taa.js.map +1 -1
  28. package/dist/posteffect/tonemap.js +6 -6
  29. package/dist/posteffect/tonemap.js.map +1 -1
  30. package/dist/render/abuffer_oit.js +2 -1
  31. package/dist/render/abuffer_oit.js.map +1 -1
  32. package/dist/render/envlight.js +6 -3
  33. package/dist/render/envlight.js.map +1 -1
  34. package/dist/render/hzb.js +11 -4
  35. package/dist/render/hzb.js.map +1 -1
  36. package/dist/render/lightpass.js +7 -15
  37. package/dist/render/lightpass.js.map +1 -1
  38. package/dist/render/renderer.js +4 -3
  39. package/dist/render/renderer.js.map +1 -1
  40. package/dist/render/rendergraph/blackboard.js +78 -0
  41. package/dist/render/rendergraph/blackboard.js.map +1 -0
  42. package/dist/render/rendergraph/executor.js +41 -11
  43. package/dist/render/rendergraph/executor.js.map +1 -1
  44. package/dist/render/rendergraph/forward_plus_builder.js +495 -201
  45. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  46. package/dist/render/rendergraph/rendergraph.js +29 -0
  47. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  48. package/dist/render/rendergraph/types.js.map +1 -1
  49. package/dist/shaders/ssr.js +52 -21
  50. package/dist/shaders/ssr.js.map +1 -1
  51. package/dist/utility/misc.js +10 -1
  52. package/dist/utility/misc.js.map +1 -1
  53. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  import { Disposable, DRef, Vector3, Vector4 } from '@zephyr3d/base';
2
- import { fetchSampler } from '../utility/misc.js';
2
+ import { getSamplerOptions, fetchSampler } from '../utility/misc.js';
3
3
  import { getDevice } from '../app/api.js';
4
4
 
5
5
  /**
@@ -75,11 +75,12 @@ import { getDevice } from '../app/api.js';
75
75
  */ initShaderBindings(pb) {
76
76
  if (pb.shaderKind === 'fragment') {
77
77
  if (this.radianceMap) {
78
- pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb.texCube().uniform(0);
78
+ // Prefiltered radiance cube: mipmap chain indexed by roughness
79
+ pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb.texCube().uniform(0).withSampler(getSamplerOptions('clamp_linear'));
79
80
  pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);
80
81
  }
81
82
  if (this.sheenRadianceMap) {
82
- pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP] = pb.texCube().uniform(0);
83
+ pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP] = pb.texCube().uniform(0).withSampler(getSamplerOptions('clamp_linear'));
83
84
  }
84
85
  if (this.irradianceSHFB) {
85
86
  const tex = pb.tex2D();
@@ -87,6 +88,8 @@ import { getDevice } from '../app/api.js';
87
88
  if (formatInfo && !formatInfo.filterable) {
88
89
  tex.sampleType('unfilterable-float');
89
90
  }
91
+ // SH coefficients are read at texel centers; nearest sampling is exact
92
+ tex.withSampler(getSamplerOptions('clamp_nearest_nomip'));
90
93
  pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = tex.uniform(0);
91
94
  pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);
92
95
  } else if (this.irradianceSH) {
@@ -1 +1 @@
1
- {"version":3,"file":"envlight.js","sources":["../../src/render/envlight.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Environment light type\r\n * @public\r\n */\r\nexport type EnvLightType = 'ibl' | 'hemisphere' | 'constant' | 'none';\r\n\r\n/**\r\n * Base class for any kind of environment light\r\n * @public\r\n */\r\nexport abstract class EnvironmentLighting extends Disposable {\r\n /**\r\n * The environment light type\r\n */\r\n abstract getType(): EnvLightType;\r\n /**\r\n * Initialize shader bindings\r\n * @param pb - The program builder\r\n */\r\n abstract initShaderBindings(pb: ProgramBuilder): void;\r\n /**\r\n * Updates the uniform values\r\n * @param bg - The bind group to be updated\r\n */\r\n abstract updateBindGroup(bg: BindGroup): void;\r\n /**\r\n * Get radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Surface roughness\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get Charlie-filtered sheen radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Sheen roughness\r\n *\r\n * @returns The sheen radiance for the fragment\r\n */\r\n abstract getSheenRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get irradiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param normal - surface normal\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp): PBShaderExp;\r\n /**\r\n * Returns whether this environment lighting supports reflective light\r\n */\r\n abstract hasRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports sheen reflective light\r\n */\r\n abstract hasSheenRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports diffuse light\r\n */\r\n abstract hasIrradiance(): boolean;\r\n}\r\n\r\n/**\r\n * IBL with SH based environment lighting\r\n * @public\r\n */\r\nexport class EnvShIBL extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP = 'zIBLRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP = 'zIBLSheenRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD = 'zIBLRadianceMapMaxLOD';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_SH = 'zIBLIrradianceSH';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_WINDOW = 'zIBLIrradianceWindow';\r\n /** @internal */\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _sheenRadianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n /** @internal */\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n /** @internal */\r\n private _irraidanceWindow: Vector3;\r\n /**\r\n * Creates an instance of EnvIBL\r\n * @param radianceMap - The radiance map\r\n * @param irradianceSH - The irradiance SH\r\n */\r\n constructor(\r\n radianceMap?: TextureCube,\r\n irradianceSH?: GPUDataBuffer,\r\n irradianceSHFB?: FrameBuffer,\r\n sheenRadianceMap?: TextureCube\r\n ) {\r\n super();\r\n this._radianceMap = new DRef(radianceMap || null);\r\n this._sheenRadianceMap = new DRef(sheenRadianceMap || null);\r\n this._irradianceSH = new DRef(irradianceSH || null);\r\n this._irradianceSHFB = new DRef(irradianceSHFB || null);\r\n this._irraidanceWindow = new Vector3();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'ibl' as const;\r\n }\r\n /** The radiance map */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n }\r\n /** The Charlie-filtered sheen radiance map */\r\n get sheenRadianceMap() {\r\n return this._sheenRadianceMap.get();\r\n }\r\n set sheenRadianceMap(tex) {\r\n this._sheenRadianceMap.set(tex);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n }\r\n /** The irradiance sh window */\r\n get irradianceWindow() {\r\n return this._irraidanceWindow;\r\n }\r\n set irradianceWindow(val) {\r\n this._irraidanceWindow = val;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n if (this.radianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb.texCube().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);\r\n }\r\n if (this.sheenRadianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP] = pb.texCube().uniform(0);\r\n }\r\n if (this.irradianceSHFB) {\r\n const tex = pb.tex2D();\r\n const formatInfo = getDevice()\r\n .getDeviceCaps()\r\n .textureCaps.getTextureFormatInfo(this.irradianceSHFB.getColorAttachments()[0].format);\r\n if (formatInfo && !formatInfo.filterable) {\r\n tex.sampleType('unfilterable-float');\r\n }\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = tex.uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n } else if (this.irradianceSH) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.vec4[9]().uniformBuffer(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n if (this.radianceMap) {\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD, this.radianceMap.mipLevelCount - 1);\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP, this.radianceMap);\r\n }\r\n if (this.sheenRadianceMap) {\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP, this.sheenRadianceMap);\r\n }\r\n if (this.irradianceSHFB) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH,\r\n this.irradianceSHFB.getColorAttachments()[0],\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n } else if (this.irradianceSH) {\r\n bg.setBuffer(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH, this.irradianceSH);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('Z_sh_Y0', [pb.vec3('v')], function () {\r\n this.$return(0.2820947917);\r\n });\r\n pb.func('Z_sh_Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Z_sh_Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Z_sh_Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Z_sh_Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('Z_sh_eval', [pb.vec3('v')], function () {\r\n this.$l.window = this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW];\r\n if (that.irradianceSHFB) {\r\n this.$l.c = pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y1(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y2(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y3(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y4(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y5(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y6(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y7(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y8(this.v),\r\n this.window.z\r\n )\r\n );\r\n } else {\r\n this.$l.c = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][0].xyz,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][1].xyz, this.Z_sh_Y1(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][2].xyz, this.Z_sh_Y2(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][3].xyz, this.Z_sh_Y3(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][4].xyz, this.Z_sh_Y4(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][5].xyz, this.Z_sh_Y5(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][6].xyz, this.Z_sh_Y6(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][7].xyz, this.Z_sh_Y7(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][8].xyz, this.Z_sh_Y8(this.v), this.window.z)\r\n );\r\n }\r\n this.$return(this.c);\r\n });\r\n return pb.getGlobalScope().Z_sh_eval(normal) as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return !!this._radianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return !!this._sheenRadianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return !!this._irradianceSH.get() || !!this._irradianceSHFB.get();\r\n }\r\n /**\r\n * Disposes the object and releases all GPU resources\r\n * @override\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._radianceMap.dispose();\r\n this._sheenRadianceMap.dispose();\r\n this._irradianceSH.dispose();\r\n this._irradianceSHFB.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Constant ambient light\r\n * @public\r\n */\r\nexport class EnvConstantAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_CONSTANT_AMBIENT = 'zConstantAmbient';\r\n /** @internal */\r\n private readonly _ambientColor: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientColor - The ambient color\r\n */\r\n constructor(ambientColor?: Vector4) {\r\n super();\r\n this._ambientColor = ambientColor ? new Vector4(ambientColor) : new Vector4(0, 0, 0, 1);\r\n }\r\n /** The ambient color */\r\n get ambientColor(): Immutable<Vector4> {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(ambientColor: Immutable<Vector4>) {\r\n if (ambientColor) {\r\n this._ambientColor.set(ambientColor);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'constant' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT, this._ambientColor);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, _normal: PBShaderExp) {\r\n return scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Hemispheric ambient light\r\n * @public\r\n */\r\nexport class EnvHemisphericAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_UP = 'zHemisphericAmbientUp';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_DOWN = 'zHemisphericAmbientDown';\r\n /** @internal */\r\n private readonly _ambientUp: Vector4;\r\n /** @internal */\r\n private readonly _ambientDown: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientUp - The upside ambient color\r\n * @param ambientDown - The downside ambient color\r\n */\r\n constructor(ambientUp: Vector4, ambientDown: Vector4) {\r\n super();\r\n this._ambientUp = new Vector4(ambientUp);\r\n this._ambientDown = new Vector4(ambientDown);\r\n }\r\n /** The upside ambient color */\r\n get ambientUp(): Immutable<Vector4> {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientUp.set(color);\r\n }\r\n }\r\n /** The downside ambient color */\r\n get ambientDown(): Immutable<Vector4> {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientDown.set(color);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'hemisphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP, this._ambientUp);\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN, this._ambientDown);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, _roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(refl.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n return this.getRadiance(scope, refl, roughness);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(normal.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n"],"names":["EnvironmentLighting","Disposable","EnvShIBL","UNIFORM_NAME_IBL_RADIANCE_MAP","UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP","UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD","UNIFORM_NAME_IBL_IRRADIANCE_SH","UNIFORM_NAME_IBL_IRRADIANCE_WINDOW","radianceMap","irradianceSH","irradianceSHFB","sheenRadianceMap","_radianceMap","DRef","_sheenRadianceMap","_irradianceSH","_irradianceSHFB","_irraidanceWindow","Vector3","getType","get","tex","set","value","irradianceWindow","val","initShaderBindings","pb","shaderKind","getGlobalScope","texCube","uniform","float","tex2D","formatInfo","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","getColorAttachments","format","filterable","sampleType","vec3","vec4","uniformBuffer","updateBindGroup","bg","setValue","mipLevelCount","setTexture","fetchSampler","setBuffer","getRadiance","scope","refl","roughness","$builder","shaderCaps","supportShaderTextureLod","textureSampleLevel","mul","rgb","textureSample","getSheenRadiance","getIrradiance","normal","that","func","$return","v","y","z","x","sub","$l","window","c","vec2","Z_sh_Y0","add","Z_sh_Y1","Z_sh_Y2","Z_sh_Y3","Z_sh_Y4","Z_sh_Y5","Z_sh_Y6","Z_sh_Y7","Z_sh_Y8","xyz","Z_sh_eval","hasRadiance","hasSheenRadiance","hasIrradiance","onDispose","dispose","EnvConstantAmbient","UNIFORM_NAME_CONSTANT_AMBIENT","ambientColor","_ambientColor","Vector4","_scope","_refl","_roughness","_normal","EnvHemisphericAmbient","UNIFORM_NAME_AMBIENT_UP","UNIFORM_NAME_AMBIENT_DOWN","ambientUp","ambientDown","_ambientUp","_ambientDown","color","factor","mix"],"mappings":"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"}
1
+ {"version":3,"file":"envlight.js","sources":["../../src/render/envlight.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler, getSamplerOptions } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Environment light type\r\n * @public\r\n */\r\nexport type EnvLightType = 'ibl' | 'hemisphere' | 'constant' | 'none';\r\n\r\n/**\r\n * Base class for any kind of environment light\r\n * @public\r\n */\r\nexport abstract class EnvironmentLighting extends Disposable {\r\n /**\r\n * The environment light type\r\n */\r\n abstract getType(): EnvLightType;\r\n /**\r\n * Initialize shader bindings\r\n * @param pb - The program builder\r\n */\r\n abstract initShaderBindings(pb: ProgramBuilder): void;\r\n /**\r\n * Updates the uniform values\r\n * @param bg - The bind group to be updated\r\n */\r\n abstract updateBindGroup(bg: BindGroup): void;\r\n /**\r\n * Get radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Surface roughness\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get Charlie-filtered sheen radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Sheen roughness\r\n *\r\n * @returns The sheen radiance for the fragment\r\n */\r\n abstract getSheenRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get irradiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param normal - surface normal\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp): PBShaderExp;\r\n /**\r\n * Returns whether this environment lighting supports reflective light\r\n */\r\n abstract hasRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports sheen reflective light\r\n */\r\n abstract hasSheenRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports diffuse light\r\n */\r\n abstract hasIrradiance(): boolean;\r\n}\r\n\r\n/**\r\n * IBL with SH based environment lighting\r\n * @public\r\n */\r\nexport class EnvShIBL extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP = 'zIBLRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP = 'zIBLSheenRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD = 'zIBLRadianceMapMaxLOD';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_SH = 'zIBLIrradianceSH';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_WINDOW = 'zIBLIrradianceWindow';\r\n /** @internal */\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _sheenRadianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n /** @internal */\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n /** @internal */\r\n private _irraidanceWindow: Vector3;\r\n /**\r\n * Creates an instance of EnvIBL\r\n * @param radianceMap - The radiance map\r\n * @param irradianceSH - The irradiance SH\r\n */\r\n constructor(\r\n radianceMap?: TextureCube,\r\n irradianceSH?: GPUDataBuffer,\r\n irradianceSHFB?: FrameBuffer,\r\n sheenRadianceMap?: TextureCube\r\n ) {\r\n super();\r\n this._radianceMap = new DRef(radianceMap || null);\r\n this._sheenRadianceMap = new DRef(sheenRadianceMap || null);\r\n this._irradianceSH = new DRef(irradianceSH || null);\r\n this._irradianceSHFB = new DRef(irradianceSHFB || null);\r\n this._irraidanceWindow = new Vector3();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'ibl' as const;\r\n }\r\n /** The radiance map */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n }\r\n /** The Charlie-filtered sheen radiance map */\r\n get sheenRadianceMap() {\r\n return this._sheenRadianceMap.get();\r\n }\r\n set sheenRadianceMap(tex) {\r\n this._sheenRadianceMap.set(tex);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n }\r\n /** The irradiance sh window */\r\n get irradianceWindow() {\r\n return this._irraidanceWindow;\r\n }\r\n set irradianceWindow(val) {\r\n this._irraidanceWindow = val;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n if (this.radianceMap) {\r\n // Prefiltered radiance cube: mipmap chain indexed by roughness\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);\r\n }\r\n if (this.sheenRadianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP] = pb\r\n .texCube()\r\n .uniform(0)\r\n .withSampler(getSamplerOptions('clamp_linear'));\r\n }\r\n if (this.irradianceSHFB) {\r\n const tex = pb.tex2D();\r\n const formatInfo = getDevice()\r\n .getDeviceCaps()\r\n .textureCaps.getTextureFormatInfo(this.irradianceSHFB.getColorAttachments()[0].format);\r\n if (formatInfo && !formatInfo.filterable) {\r\n tex.sampleType('unfilterable-float');\r\n }\r\n // SH coefficients are read at texel centers; nearest sampling is exact\r\n tex.withSampler(getSamplerOptions('clamp_nearest_nomip'));\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = tex.uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n } else if (this.irradianceSH) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.vec4[9]().uniformBuffer(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n if (this.radianceMap) {\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD, this.radianceMap.mipLevelCount - 1);\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP, this.radianceMap);\r\n }\r\n if (this.sheenRadianceMap) {\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP, this.sheenRadianceMap);\r\n }\r\n if (this.irradianceSHFB) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH,\r\n this.irradianceSHFB.getColorAttachments()[0],\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n } else if (this.irradianceSH) {\r\n bg.setBuffer(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH, this.irradianceSH);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('Z_sh_Y0', [pb.vec3('v')], function () {\r\n this.$return(0.2820947917);\r\n });\r\n pb.func('Z_sh_Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Z_sh_Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Z_sh_Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Z_sh_Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('Z_sh_eval', [pb.vec3('v')], function () {\r\n this.$l.window = this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW];\r\n if (that.irradianceSHFB) {\r\n this.$l.c = pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y1(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y2(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y3(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y4(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y5(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y6(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y7(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y8(this.v),\r\n this.window.z\r\n )\r\n );\r\n } else {\r\n this.$l.c = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][0].xyz,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][1].xyz, this.Z_sh_Y1(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][2].xyz, this.Z_sh_Y2(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][3].xyz, this.Z_sh_Y3(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][4].xyz, this.Z_sh_Y4(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][5].xyz, this.Z_sh_Y5(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][6].xyz, this.Z_sh_Y6(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][7].xyz, this.Z_sh_Y7(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][8].xyz, this.Z_sh_Y8(this.v), this.window.z)\r\n );\r\n }\r\n this.$return(this.c);\r\n });\r\n return pb.getGlobalScope().Z_sh_eval(normal) as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return !!this._radianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return !!this._sheenRadianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return !!this._irradianceSH.get() || !!this._irradianceSHFB.get();\r\n }\r\n /**\r\n * Disposes the object and releases all GPU resources\r\n * @override\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._radianceMap.dispose();\r\n this._sheenRadianceMap.dispose();\r\n this._irradianceSH.dispose();\r\n this._irradianceSHFB.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Constant ambient light\r\n * @public\r\n */\r\nexport class EnvConstantAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_CONSTANT_AMBIENT = 'zConstantAmbient';\r\n /** @internal */\r\n private readonly _ambientColor: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientColor - The ambient color\r\n */\r\n constructor(ambientColor?: Vector4) {\r\n super();\r\n this._ambientColor = ambientColor ? new Vector4(ambientColor) : new Vector4(0, 0, 0, 1);\r\n }\r\n /** The ambient color */\r\n get ambientColor(): Immutable<Vector4> {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(ambientColor: Immutable<Vector4>) {\r\n if (ambientColor) {\r\n this._ambientColor.set(ambientColor);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'constant' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT, this._ambientColor);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, _normal: PBShaderExp) {\r\n return scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Hemispheric ambient light\r\n * @public\r\n */\r\nexport class EnvHemisphericAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_UP = 'zHemisphericAmbientUp';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_DOWN = 'zHemisphericAmbientDown';\r\n /** @internal */\r\n private readonly _ambientUp: Vector4;\r\n /** @internal */\r\n private readonly _ambientDown: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientUp - The upside ambient color\r\n * @param ambientDown - The downside ambient color\r\n */\r\n constructor(ambientUp: Vector4, ambientDown: Vector4) {\r\n super();\r\n this._ambientUp = new Vector4(ambientUp);\r\n this._ambientDown = new Vector4(ambientDown);\r\n }\r\n /** The upside ambient color */\r\n get ambientUp(): Immutable<Vector4> {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientUp.set(color);\r\n }\r\n }\r\n /** The downside ambient color */\r\n get ambientDown(): Immutable<Vector4> {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientDown.set(color);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'hemisphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP, this._ambientUp);\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN, this._ambientDown);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, _roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(refl.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getSheenRadiance}\r\n * @override\r\n */\r\n getSheenRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n return this.getRadiance(scope, refl, roughness);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(normal.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasSheenRadiance}\r\n * @override\r\n */\r\n hasSheenRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n"],"names":["EnvironmentLighting","Disposable","EnvShIBL","UNIFORM_NAME_IBL_RADIANCE_MAP","UNIFORM_NAME_IBL_SHEEN_RADIANCE_MAP","UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD","UNIFORM_NAME_IBL_IRRADIANCE_SH","UNIFORM_NAME_IBL_IRRADIANCE_WINDOW","radianceMap","irradianceSH","irradianceSHFB","sheenRadianceMap","_radianceMap","DRef","_sheenRadianceMap","_irradianceSH","_irradianceSHFB","_irraidanceWindow","Vector3","getType","get","tex","set","value","irradianceWindow","val","initShaderBindings","pb","shaderKind","getGlobalScope","texCube","uniform","withSampler","getSamplerOptions","float","tex2D","formatInfo","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","getColorAttachments","format","filterable","sampleType","vec3","vec4","uniformBuffer","updateBindGroup","bg","setValue","mipLevelCount","setTexture","fetchSampler","setBuffer","getRadiance","scope","refl","roughness","$builder","shaderCaps","supportShaderTextureLod","textureSampleLevel","mul","rgb","textureSample","getSheenRadiance","getIrradiance","normal","that","func","$return","v","y","z","x","sub","$l","window","c","vec2","Z_sh_Y0","add","Z_sh_Y1","Z_sh_Y2","Z_sh_Y3","Z_sh_Y4","Z_sh_Y5","Z_sh_Y6","Z_sh_Y7","Z_sh_Y8","xyz","Z_sh_eval","hasRadiance","hasSheenRadiance","hasIrradiance","onDispose","dispose","EnvConstantAmbient","UNIFORM_NAME_CONSTANT_AMBIENT","ambientColor","_ambientColor","Vector4","_scope","_refl","_roughness","_normal","EnvHemisphericAmbient","UNIFORM_NAME_AMBIENT_UP","UNIFORM_NAME_AMBIENT_DOWN","ambientUp","ambientDown","_ambientUp","_ambientDown","color","factor","mix"],"mappings":"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"}
@@ -10,6 +10,12 @@ let hzbProgram = null;
10
10
  let hzbBindGroup = null;
11
11
  let blitter = null;
12
12
  const srcSize = new Int32Array(2);
13
+ class HiZInitBlitter extends CopyBlitter {
14
+ /** @override */ filter(scope, type, srcTex, srcUV, srcLayer, sampleType) {
15
+ const depth = super.filter(scope, type, srcTex, srcUV, srcLayer, sampleType);
16
+ return scope.$builder.vec4(depth.xx, 0, 1);
17
+ }
18
+ }
13
19
  /*
14
20
  vec3 trace_ray(vec3 ray_start, vec3 ray_dir)
15
21
  {
@@ -212,10 +218,11 @@ float3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {
212
218
  this.$l.minCoord = pb.ivec2(0, 0);
213
219
  this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));
214
220
  for(let i = 0; i < 4; i++){
215
- this.$l[`d${i}`] = pb.textureLoad(this.srcTex, pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord), device.type === 'webgpu' ? 0 : this.srcMipLevel).r;
221
+ this.$l[`d${i}`] = pb.textureLoad(this.srcTex, pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord), device.type === 'webgpu' ? 0 : this.srcMipLevel);
216
222
  }
217
- this.$l.d = pb.min(pb.min(this.d0, this.d1), pb.min(this.d2, this.d3));
218
- this.$outputs.color = pb.vec4(this.d, 0, 0, 1);
223
+ this.$l.minDepth = pb.min(pb.min(this.d0.r, this.d1.r), pb.min(this.d2.r, this.d3.r));
224
+ this.$l.maxDepth = pb.max(pb.max(this.d0.g, this.d1.g), pb.max(this.d2.g, this.d3.g));
225
+ this.$outputs.color = pb.vec4(this.minDepth, this.maxDepth, 0, 1);
219
226
  });
220
227
  }
221
228
  });
@@ -251,7 +258,7 @@ function buildHiZ(sourceTex, HiZFrameBuffer) {
251
258
  if (!hzbProgram) {
252
259
  hzbProgram = buildHZBProgram(device);
253
260
  hzbBindGroup = device.createBindGroup(hzbProgram.bindGroupLayouts[0]);
254
- blitter = new CopyBlitter();
261
+ blitter = new HiZInitBlitter();
255
262
  }
256
263
  blitter.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));
257
264
  device.pushDeviceStates();
@@ -1 +1 @@
1
- {"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, FrameBuffer, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { CopyBlitter } from '../blitter';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram> = null;\r\nlet hzbBindGroup: Nullable<BindGroup> = null;\r\nlet blitter: Nullable<CopyBlitter> = null;\r\nconst srcSize = new Int32Array(2);\r\n\r\n/*\r\nvec3 trace_ray(vec3 ray_start, vec3 ray_dir)\r\n{\r\n\r\n if (ray_dir.z < 0.0) {\r\n return vec3(0);\r\n }\r\n\r\n ray_dir = normalize(ray_dir);\r\n ivec2 work_size = SCREEN_SIZE_INT;\r\n\r\n const int loop_max = 150;\r\n int mipmap = 0;\r\n int max_iter = loop_max;\r\n\r\n vec3 pos = ray_start;\r\n\r\n // Move pos by a small bias\r\n pos += ray_dir * 0.008;\r\n\r\n float hit_bias = 0.0017;\r\n\r\n while (mipmap > -1 && max_iter --> 0)\r\n {\r\n\r\n // Check if we are out of screen bounds, if so, return\r\n if (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0 || pos.z < 0.0 || pos.z > 1.0)\r\n {\r\n return vec3(0,0,0);\r\n }\r\n\r\n // Fetch the current minimum cell plane height\r\n float cell_z = textureLod(DownscaledDepth, pos.xy, mipmap).x;\r\n\r\n // Compute the fractional part of the coordinate (scaled by the working size)\r\n // so the values will be between 0.0 and 1.0\r\n vec2 fract_coord = mod(pos.xy * work_size, 1.0);\r\n\r\n // Modify fract coord based on which direction we are stepping in.\r\n // Fract coord now contains the percentage how far we moved already in\r\n // the current cell in each direction.\r\n fract_coord.x = ray_dir.x > 0.0 ? fract_coord.x : 1.0 - fract_coord.x;\r\n fract_coord.y = ray_dir.y > 0.0 ? fract_coord.y : 1.0 - fract_coord.y;\r\n\r\n // Compute maximum k and minimum k for which the ray would still be\r\n // inside of the cell.\r\n vec2 max_k_v = (1.0 / abs(ray_dir.xy)) / work_size.xy;\r\n vec2 min_k_v = -max_k_v * fract_coord.xy;\r\n\r\n // Scale the maximum k by the percentage we already processed in the current cell,\r\n // since e.g. if we already moved 50%, we can only move another 50%.\r\n max_k_v *= 1.0 - fract_coord.xy;\r\n\r\n // The maximum k is the minimum of the both sub-k's since if one component-maximum\r\n // is reached, the ray is out of the cell\r\n float max_k = min(max_k_v.x, max_k_v.y);\r\n\r\n // Same applies to the min_k, but because min_k is negative we have to use max()\r\n float min_k = max(min_k_v.x, min_k_v.y);\r\n\r\n // Check if the ray intersects with the cell plane. We have the following\r\n // equation:\r\n // pos.z + k * ray_dir.z = cell.z\r\n // So k is:\r\n float k = (cell_z - pos.z) / ray_dir.z;\r\n\r\n // Optional: Abort when ray didn't exactly intersect:\r\n // if (k < min_k && mipmap <= 0) {\r\n // return vec3(0);\r\n // }\r\n\r\n // Check if we intersected the cell\r\n if (k < max_k + hit_bias)\r\n {\r\n // Clamp k\r\n k = max(min_k, k);\r\n\r\n if (mipmap < 1) {\r\n pos += k * ray_dir;\r\n return pos;\r\n }\r\n\r\n // If we hit anything at a higher mipmap, step up to a higher detailed\r\n // mipmap:\r\n mipmap -= 2;\r\n work_size *= 4;\r\n } else {\r\n\r\n // If we hit nothing, move to the next cell, with a small bias\r\n pos += max_k * ray_dir * 1.04;\r\n }\r\n\r\n mipmap += 1;\r\n work_size /= 2;\r\n }\r\n\r\n return vec3(0);\r\n}\r\n*/\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n return floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n return input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n float2 cell_size = 1.0 / cell_count;\r\n float2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n float2 solutions = (planes - pos)/dir.xy;\r\n float3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n intersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n return intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n return (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n return input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n float level = HIZ_START_LEVEL;\r\n float3 v_z = v/v.z;\r\n float2 hi_z_size = cell_count(level);\r\n float3 ray = p;\r\n\r\n float2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n float2 cross_offset = cross_step * 0.00001;\r\n cross_step = saturate(cross_step);\r\n\r\n float2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n ray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n iterations = 0;\r\n while(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n // get the cell number of the current ray\r\n float2 current_cell_count = cell_count(level);\r\n float2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n // get the minimum depth plane in which the current ray resides\r\n float min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n // intersect only if ray depth is below the minimum depth plane\r\n float3 tmp_ray = ray;\r\n if(v.z > 0) {\r\n float min_minus_ray = min_z - ray.z;\r\n tmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n float2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n if(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }else{\r\n if(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = 2;\r\n }\r\n }\r\n } else if(ray.z < min_z) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }\r\n\r\n ray.xyz = tmp_ray.xyz;\r\n --level;\r\n\r\n ++iterations;\r\n }\r\n return ray;\r\n}\r\n*/\r\n\r\nfunction buildHZBProgram(device: AbstractDevice) {\r\n const program = device.buildRenderProgram({\r\n label: 'HZBBuilder',\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srcSize = pb.ivec2().uniform(0);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.int().uniform(0);\r\n }\r\n pb.main(function () {\r\n this.$l.coord = pb.mul(pb.ivec2(this.$builtins.fragCoord.xy), 2);\r\n this.$l.minCoord = pb.ivec2(0, 0);\r\n this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));\r\n for (let i = 0; i < 4; i++) {\r\n this.$l[`d${i}`] = pb.textureLoad(\r\n this.srcTex,\r\n pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord),\r\n device.type === 'webgpu' ? 0 : this.srcMipLevel\r\n ).r;\r\n }\r\n this.$l.d = pb.min(pb.min(this.d0, this.d1), pb.min(this.d2, this.d3));\r\n this.$outputs.color = pb.vec4(this.d, 0, 0, 1);\r\n });\r\n }\r\n })!;\r\n program.name = '@HZB_Builder';\r\n return program;\r\n}\r\n\r\nfunction buildHiZLevel(\r\n device: AbstractDevice,\r\n miplevel: number,\r\n srcTexture: Texture2D,\r\n dstTexture: Texture2D\r\n) {\r\n const sampler = fetchSampler('clamp_nearest');\r\n const framebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n [dstTexture],\r\n null,\r\n false,\r\n 1,\r\n true,\r\n miplevel + 1\r\n );\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n srcSize[0] = Math.max(srcTexture.width >> miplevel, 1);\r\n srcSize[1] = Math.max(srcTexture.height >> miplevel, 1);\r\n hzbBindGroup!.setValue('srcSize', srcSize);\r\n if (device.type === 'webgpu') {\r\n hzbBindGroup!.setTextureView('srcTex', srcTexture, miplevel, 0, 1, sampler);\r\n } else {\r\n hzbBindGroup!.setTexture('srcTex', srcTexture, sampler);\r\n hzbBindGroup!.setValue('srcMipLevel', miplevel);\r\n }\r\n device.setProgram(hzbProgram);\r\n device.setBindGroup(0, hzbBindGroup!);\r\n device.setFramebuffer(framebuffer);\r\n drawFullscreenQuad();\r\n if (srcTexture !== dstTexture) {\r\n device.copyFramebufferToTexture2D(framebuffer, 0, srcTexture, miplevel + 1);\r\n }\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n}\r\n\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n if (!hzbProgram) {\r\n hzbProgram = buildHZBProgram(device);\r\n hzbBindGroup = device.createBindGroup(hzbProgram.bindGroupLayouts[0]);\r\n blitter = new CopyBlitter();\r\n }\r\n blitter!.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));\r\n device.pushDeviceStates();\r\n const srcTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n HiZFrameBuffer.getWidth(),\r\n HiZFrameBuffer.getHeight(),\r\n HiZFrameBuffer.getColorAttachments()[0].format,\r\n null,\r\n true\r\n );\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, dstTex);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroup","blitter","srcSize","Int32Array","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","type","y","neg","fragment","color","srcTex","tex2D","sampleType","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","r","d","min","d0","d1","d2","d3","name","buildHiZLevel","miplevel","srcTexture","dstTexture","sampler","fetchSampler","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","Math","max","width","height","setValue","setTextureView","setTexture","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","createBindGroup","bindGroupLayouts","CopyBlitter","blit","pushDeviceStates","getColorAttachments","mipLevelCount","tmpFramebuffer","getWidth","getHeight","format","dstTex","popDeviceStates"],"mappings":"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"}
1
+ {"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { CopyBlitter, type BlitType } from '../blitter';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram> = null;\r\nlet hzbBindGroup: Nullable<BindGroup> = null;\r\nlet blitter: Nullable<HiZInitBlitter> = null;\r\nconst srcSize = new Int32Array(2);\r\n\r\nclass HiZInitBlitter extends CopyBlitter {\r\n /** @override */\r\n filter(\r\n scope: PBInsideFunctionScope,\r\n type: BlitType,\r\n srcTex: PBShaderExp,\r\n srcUV: PBShaderExp,\r\n srcLayer: PBShaderExp,\r\n sampleType: 'float' | 'int' | 'uint'\r\n ) {\r\n const depth = super.filter(scope, type, srcTex, srcUV, srcLayer, sampleType);\r\n return scope.$builder.vec4(depth.xx, 0, 1);\r\n }\r\n}\r\n\r\n/*\r\nvec3 trace_ray(vec3 ray_start, vec3 ray_dir)\r\n{\r\n\r\n if (ray_dir.z < 0.0) {\r\n return vec3(0);\r\n }\r\n\r\n ray_dir = normalize(ray_dir);\r\n ivec2 work_size = SCREEN_SIZE_INT;\r\n\r\n const int loop_max = 150;\r\n int mipmap = 0;\r\n int max_iter = loop_max;\r\n\r\n vec3 pos = ray_start;\r\n\r\n // Move pos by a small bias\r\n pos += ray_dir * 0.008;\r\n\r\n float hit_bias = 0.0017;\r\n\r\n while (mipmap > -1 && max_iter --> 0)\r\n {\r\n\r\n // Check if we are out of screen bounds, if so, return\r\n if (pos.x < 0.0 || pos.y < 0.0 || pos.x > 1.0 || pos.y > 1.0 || pos.z < 0.0 || pos.z > 1.0)\r\n {\r\n return vec3(0,0,0);\r\n }\r\n\r\n // Fetch the current minimum cell plane height\r\n float cell_z = textureLod(DownscaledDepth, pos.xy, mipmap).x;\r\n\r\n // Compute the fractional part of the coordinate (scaled by the working size)\r\n // so the values will be between 0.0 and 1.0\r\n vec2 fract_coord = mod(pos.xy * work_size, 1.0);\r\n\r\n // Modify fract coord based on which direction we are stepping in.\r\n // Fract coord now contains the percentage how far we moved already in\r\n // the current cell in each direction.\r\n fract_coord.x = ray_dir.x > 0.0 ? fract_coord.x : 1.0 - fract_coord.x;\r\n fract_coord.y = ray_dir.y > 0.0 ? fract_coord.y : 1.0 - fract_coord.y;\r\n\r\n // Compute maximum k and minimum k for which the ray would still be\r\n // inside of the cell.\r\n vec2 max_k_v = (1.0 / abs(ray_dir.xy)) / work_size.xy;\r\n vec2 min_k_v = -max_k_v * fract_coord.xy;\r\n\r\n // Scale the maximum k by the percentage we already processed in the current cell,\r\n // since e.g. if we already moved 50%, we can only move another 50%.\r\n max_k_v *= 1.0 - fract_coord.xy;\r\n\r\n // The maximum k is the minimum of the both sub-k's since if one component-maximum\r\n // is reached, the ray is out of the cell\r\n float max_k = min(max_k_v.x, max_k_v.y);\r\n\r\n // Same applies to the min_k, but because min_k is negative we have to use max()\r\n float min_k = max(min_k_v.x, min_k_v.y);\r\n\r\n // Check if the ray intersects with the cell plane. We have the following\r\n // equation:\r\n // pos.z + k * ray_dir.z = cell.z\r\n // So k is:\r\n float k = (cell_z - pos.z) / ray_dir.z;\r\n\r\n // Optional: Abort when ray didn't exactly intersect:\r\n // if (k < min_k && mipmap <= 0) {\r\n // return vec3(0);\r\n // }\r\n\r\n // Check if we intersected the cell\r\n if (k < max_k + hit_bias)\r\n {\r\n // Clamp k\r\n k = max(min_k, k);\r\n\r\n if (mipmap < 1) {\r\n pos += k * ray_dir;\r\n return pos;\r\n }\r\n\r\n // If we hit anything at a higher mipmap, step up to a higher detailed\r\n // mipmap:\r\n mipmap -= 2;\r\n work_size *= 4;\r\n } else {\r\n\r\n // If we hit nothing, move to the next cell, with a small bias\r\n pos += max_k * ray_dir * 1.04;\r\n }\r\n\r\n mipmap += 1;\r\n work_size /= 2;\r\n }\r\n\r\n return vec3(0);\r\n}\r\n*/\r\n/*\r\nfloat2 cell(float2 ray, float2 cell_count, uint camera) {\r\n return floor(ray.xy * cell_count);\r\n}\r\n\r\nfloat2 cell_count(float level) {\r\n return input_texture2_size / (level == 0.0 ? 1.0 : exp2(level));\r\n}\r\n\r\nfloat3 intersect_cell_boundary(float3 pos, float3 dir, float2 cell_id, float2 cell_count, float2 cross_step, float2 cross_offset, uint camera) {\r\n float2 cell_size = 1.0 / cell_count;\r\n float2 planes = cell_id/cell_count + cell_size * cross_step;\r\n\r\n float2 solutions = (planes - pos)/dir.xy;\r\n float3 intersection_pos = pos + dir * min(solutions.x, solutions.y);\r\n\r\n intersection_pos.xy += (solutions.x < solutions.y) ? float2(cross_offset.x, 0.0) : float2(0.0, cross_offset.y);\r\n\r\n return intersection_pos;\r\n}\r\n\r\nbool crossed_cell_boundary(float2 cell_id_one, float2 cell_id_two) {\r\n return (int)cell_id_one.x != (int)cell_id_two.x || (int)cell_id_one.y != (int)cell_id_two.y;\r\n}\r\n\r\nfloat minimum_depth_plane(float2 ray, float level, float2 cell_count, uint camera) {\r\n return input_texture2.Load(int3(vr_stereo_to_mono(ray.xy, camera) * cell_count, level)).r;\r\n}\r\n\r\nfloat3 hi_z_trace(float3 p, float3 v, in uint camera, out uint iterations) {\r\n float level = HIZ_START_LEVEL;\r\n float3 v_z = v/v.z;\r\n float2 hi_z_size = cell_count(level);\r\n float3 ray = p;\r\n\r\n float2 cross_step = float2(v.x >= 0.0 ? 1.0 : -1.0, v.y >= 0.0 ? 1.0 : -1.0);\r\n float2 cross_offset = cross_step * 0.00001;\r\n cross_step = saturate(cross_step);\r\n\r\n float2 ray_cell = cell(ray.xy, hi_z_size.xy, camera);\r\n ray = intersect_cell_boundary(ray, v, ray_cell, hi_z_size, cross_step, cross_offset, camera);\r\n\r\n iterations = 0;\r\n while(level >= HIZ_STOP_LEVEL && iterations < MAX_ITERATIONS) {\r\n // get the cell number of the current ray\r\n float2 current_cell_count = cell_count(level);\r\n float2 old_cell_id = cell(ray.xy, current_cell_count, camera);\r\n\r\n // get the minimum depth plane in which the current ray resides\r\n float min_z = minimum_depth_plane(ray.xy, level, current_cell_count, camera);\r\n\r\n // intersect only if ray depth is below the minimum depth plane\r\n float3 tmp_ray = ray;\r\n if(v.z > 0) {\r\n float min_minus_ray = min_z - ray.z;\r\n tmp_ray = min_minus_ray > 0 ? ray + v_z*min_minus_ray : tmp_ray;\r\n float2 new_cell_id = cell(tmp_ray.xy, current_cell_count, camera);\r\n if(crossed_cell_boundary(old_cell_id, new_cell_id)) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }else{\r\n if(level == 1 && abs(min_minus_ray) > 0.0001) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = 2;\r\n }\r\n }\r\n } else if(ray.z < min_z) {\r\n tmp_ray = intersect_cell_boundary(ray, v, old_cell_id, current_cell_count, cross_step, cross_offset, camera);\r\n level = min(HIZ_MAX_LEVEL, level + 2.0f);\r\n }\r\n\r\n ray.xyz = tmp_ray.xyz;\r\n --level;\r\n\r\n ++iterations;\r\n }\r\n return ray;\r\n}\r\n*/\r\n\r\nfunction buildHZBProgram(device: AbstractDevice) {\r\n const program = device.buildRenderProgram({\r\n label: 'HZBBuilder',\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srcSize = pb.ivec2().uniform(0);\r\n if (device.type !== 'webgpu') {\r\n this.srcMipLevel = pb.int().uniform(0);\r\n }\r\n pb.main(function () {\r\n this.$l.coord = pb.mul(pb.ivec2(this.$builtins.fragCoord.xy), 2);\r\n this.$l.minCoord = pb.ivec2(0, 0);\r\n this.$l.maxCoord = pb.sub(this.srcSize, pb.ivec2(1, 1));\r\n for (let i = 0; i < 4; i++) {\r\n this.$l[`d${i}`] = pb.textureLoad(\r\n this.srcTex,\r\n pb.clamp(pb.add(this.coord, pb.ivec2(i >> 1, i & 1)), this.minCoord, this.maxCoord),\r\n device.type === 'webgpu' ? 0 : this.srcMipLevel\r\n );\r\n }\r\n this.$l.minDepth = pb.min(pb.min(this.d0.r, this.d1.r), pb.min(this.d2.r, this.d3.r));\r\n this.$l.maxDepth = pb.max(pb.max(this.d0.g, this.d1.g), pb.max(this.d2.g, this.d3.g));\r\n this.$outputs.color = pb.vec4(this.minDepth, this.maxDepth, 0, 1);\r\n });\r\n }\r\n })!;\r\n program.name = '@HZB_Builder';\r\n return program;\r\n}\r\n\r\nfunction buildHiZLevel(\r\n device: AbstractDevice,\r\n miplevel: number,\r\n srcTexture: Texture2D,\r\n dstTexture: Texture2D\r\n) {\r\n const sampler = fetchSampler('clamp_nearest');\r\n const framebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n [dstTexture],\r\n null,\r\n false,\r\n 1,\r\n true,\r\n miplevel + 1\r\n );\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n srcSize[0] = Math.max(srcTexture.width >> miplevel, 1);\r\n srcSize[1] = Math.max(srcTexture.height >> miplevel, 1);\r\n hzbBindGroup!.setValue('srcSize', srcSize);\r\n if (device.type === 'webgpu') {\r\n hzbBindGroup!.setTextureView('srcTex', srcTexture, miplevel, 0, 1, sampler);\r\n } else {\r\n hzbBindGroup!.setTexture('srcTex', srcTexture, sampler);\r\n hzbBindGroup!.setValue('srcMipLevel', miplevel);\r\n }\r\n device.setProgram(hzbProgram);\r\n device.setBindGroup(0, hzbBindGroup!);\r\n device.setFramebuffer(framebuffer);\r\n drawFullscreenQuad();\r\n if (srcTexture !== dstTexture) {\r\n device.copyFramebufferToTexture2D(framebuffer, 0, srcTexture, miplevel + 1);\r\n }\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n}\r\n\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n if (!hzbProgram) {\r\n hzbProgram = buildHZBProgram(device);\r\n hzbBindGroup = device.createBindGroup(hzbProgram.bindGroupLayouts[0]);\r\n blitter = new HiZInitBlitter();\r\n }\r\n blitter!.blit(sourceTex, HiZFrameBuffer, fetchSampler('clamp_nearest'));\r\n device.pushDeviceStates();\r\n const srcTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n if (device.type === 'webgpu') {\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, srcTex);\r\n }\r\n } else {\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n HiZFrameBuffer.getWidth(),\r\n HiZFrameBuffer.getHeight(),\r\n HiZFrameBuffer.getColorAttachments()[0].format,\r\n null,\r\n true\r\n );\r\n const dstTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, dstTex);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroup","blitter","srcSize","Int32Array","HiZInitBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","depth","$builder","vec4","xx","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","add","mul","xy","y","neg","fragment","color","tex2D","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","minDepth","min","d0","r","d1","d2","d3","maxDepth","max","g","name","buildHiZLevel","miplevel","srcTexture","dstTexture","sampler","fetchSampler","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","Math","width","height","setValue","setTextureView","setTexture","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","createBindGroup","bindGroupLayouts","blit","pushDeviceStates","getColorAttachments","mipLevelCount","tmpFramebuffer","getWidth","getHeight","format","dstTex","popDeviceStates"],"mappings":"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"}
@@ -2,20 +2,19 @@ import { RenderPass } from './renderpass.js';
2
2
  import { MaterialVaryingFlags, RENDER_PASS_TYPE_LIGHT, QUEUE_OPAQUE, QUEUE_TRANSPARENT } from '../values.js';
3
3
  import { Vector4 } from '@zephyr3d/base';
4
4
  import { ShaderHelper } from '../material/shader/helper.js';
5
- import { PostEffectLayer } from '../posteffect/posteffect.js';
6
5
 
7
6
  const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE;
8
7
  const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_NORMAL;
9
- /**
10
- * Forward render pass
11
- * @internal
8
+ /**
9
+ * Forward render pass
10
+ * @internal
12
11
  */ class LightPass extends RenderPass {
13
12
  /** @internal */ _shadowMapHash;
14
13
  /** @internal */ _transmission;
15
14
  /** @internal */ _renderOpaque;
16
15
  /** @internal */ _renderTransparent;
17
- /**
18
- * Creates an instance of ForwardRenderPass
16
+ /**
17
+ * Creates an instance of ForwardRenderPass
19
18
  */ constructor(){
20
19
  super(RENDER_PASS_TYPE_LIGHT);
21
20
  this._shadowMapHash = null;
@@ -143,7 +142,6 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHN
143
142
  items?.opaque,
144
143
  items?.transparent
145
144
  ];
146
- const transparentPass = lists.length - 1;
147
145
  for(let i = 0; i < lists.length; i++){
148
146
  const isOpaquePass = i === 0;
149
147
  if (isOpaquePass && !this._renderOpaque || !isOpaquePass && !this._renderTransparent) {
@@ -231,14 +229,8 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHN
231
229
  ctx.device.popDeviceStates();
232
230
  }
233
231
  }
234
- if (!renderQueue.needSceneColor() || ctx.sceneColorTexture) {
235
- if (i === 0 || i === transparentPass) {
236
- ctx.compositor?.drawPostEffects(ctx, i === 0 ? PostEffectLayer.opaque : PostEffectLayer.transparent, ctx.linearDepthTexture);
237
- if (i === 0 && surfaceMRT && (ctx.device.getFramebuffer()?.getColorAttachments().length ?? 0) <= 1) {
238
- ctx.materialFlags &= ~surfaceMRT;
239
- }
240
- }
241
- }
232
+ // Post effects of all layers are built as render graph passes; the
233
+ // opaque-layer chain runs between the opaque and transparent passes.
242
234
  }
243
235
  if (tmpFramebuffer) {
244
236
  ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);
@@ -1 +1 @@
1
- {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { PostEffectLayer } from '../posteffect/posteffect';\r\nimport type { Camera } from '../camera';\r\n\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\nconst ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /** @internal */\r\n protected _renderOpaque: boolean;\r\n /** @internal */\r\n protected _renderTransparent: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._renderOpaque = true;\r\n this._renderTransparent = true;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n get renderOpaque() {\r\n return this._renderOpaque;\r\n }\r\n set renderOpaque(val: boolean) {\r\n this._renderOpaque = !!val;\r\n }\r\n /** @internal */\r\n get renderTransparent() {\r\n return this._renderTransparent;\r\n }\r\n set renderTransparent(val: boolean) {\r\n this._renderTransparent = !!val;\r\n }\r\n /** @internal */\r\n protected getAdditiveLightPassColorAttachments(ctx: DrawContext, materialFlags: number) {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n if (!framebuffer) {\r\n return null;\r\n }\r\n const attachments: any[] = [framebuffer.getColorAttachments()[0]];\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\r\n attachments.push(ctx.SkinSSSTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n }\r\n /** @internal */\r\n protected selectTransparentOITShadowLight(ctx: DrawContext, renderQueue: RenderQueue) {\r\n const shadowMapInfo = ctx.shadowMapInfo;\r\n if (!shadowMapInfo || shadowMapInfo.size === 0) {\r\n return null;\r\n }\r\n if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {\r\n return renderQueue.primaryDirectionalLight;\r\n }\r\n if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {\r\n return renderQueue.primaryTransmissionLight;\r\n }\r\n for (const light of renderQueue.shadowedLights) {\r\n if (shadowMapInfo.has(light)) {\r\n return light;\r\n }\r\n }\r\n return shadowMapInfo.keys().next().value ?? null;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\r\n ctx.lightBlending ? 1 : 0\r\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\r\n ctx.HiZTexture?.uid ?? 0\r\n }`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env!.light.type !== 'none' &&\r\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight!.clusterParam,\r\n ctx.clusteredLight!.countParam,\r\n ctx.clusteredLight!.lightBuffer!,\r\n ctx.clusteredLight!.lightIndexTexture!\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.heightFogParams,\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;\r\n const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const tmpFramebuffer = surfaceMRT\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const needsTransparentSingleColorFramebuffer =\r\n !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;\r\n const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : tmpFramebuffer;\r\n const oit =\r\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\r\n ? camera.oit\r\n : null;\r\n if (!oit && renderQueue.drawTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n const transparentPass = lists.length - 1;\r\n for (let i = 0; i < lists.length; i++) {\r\n const isOpaquePass = i === 0;\r\n if ((isOpaquePass && !this._renderOpaque) || (!isOpaquePass && !this._renderTransparent)) {\r\n continue;\r\n }\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n const isolateTransparentABufferLightPasses =\r\n !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';\r\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n const runLightPass = (lights: PunctualLight[]) => {\r\n if (ctx.oit && isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n return;\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n ctx.oit.endPass(ctx, p);\r\n } else {\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n }\r\n };\r\n const runAdditiveLightPass = (lights: PunctualLight[]) => {\r\n const passFramebuffer =\r\n ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;\r\n if (ctx.lightBlending && passFramebuffer && !ctx.oit) {\r\n const savedMaterialFlags = ctx.materialFlags;\r\n ctx.materialFlags =\r\n ctx.queue === QUEUE_TRANSPARENT\r\n ? savedMaterialFlags & ~SURFACE_MRT_FLAGS\r\n : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(passFramebuffer);\r\n try {\r\n runLightPass(lights);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.device.popDeviceStates();\r\n }\r\n } else {\r\n runLightPass(lights);\r\n }\r\n };\r\n let lightIndex = 0;\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n runAdditiveLightPass([k]);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n runAdditiveLightPass(renderQueue.unshadowedLights);\r\n }\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (!renderQueue.needSceneColor() || ctx.sceneColorTexture) {\r\n if (i === 0 || i === transparentPass) {\r\n ctx.compositor?.drawPostEffects(\r\n ctx,\r\n i === 0 ? PostEffectLayer.opaque : PostEffectLayer.transparent,\r\n ctx.linearDepthTexture!\r\n );\r\n if (\r\n i === 0 &&\r\n surfaceMRT &&\r\n (ctx.device.getFramebuffer()?.getColorAttachments().length ?? 0) <= 1\r\n ) {\r\n ctx.materialFlags &= ~surfaceMRT;\r\n }\r\n }\r\n }\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);\r\n }\r\n ctx.oit = null;\r\n }\r\n}\r\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","getAdditiveLightPassColorAttachments","ctx","materialFlags","framebuffer","device","getFramebuffer","attachments","getColorAttachments","push","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","length","selectTransparentOITShadowLight","renderQueue","shadowMapInfo","size","primaryDirectionalLight","has","primaryTransmissionLight","light","shadowedLights","keys","next","value","_getGlobalBindGroupHash","camera","currentShadowLight","runtimeId","lightBlending","oit","calculateHash","env","getHash","linearDepthTexture","uid","sceneColorTexture","HiZTexture","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","scene","flip","isAutoFlip","surfaceMRT","additiveOpaqueMaterialFlags","additiveTransparentMaterialFlags","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getDepthAttachment","needsTransparentSingleColorFramebuffer","transparentTmpFramebuffer","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","transparentPass","i","isOpaquePass","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","isolateTransparentABufferLightPasses","getType","fogPresents","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderSky","renderFog","needSceneColor","compositor","drawPostEffects","PostEffectLayer","releaseFrameBuffer"],"mappings":"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"}
1
+ {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\nimport type { Nullable } from '@zephyr3d/base';\nimport { Vector4 } from '@zephyr3d/base';\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\nimport type { PunctualLight } from '../scene/light';\nimport type { DrawContext } from './drawable';\nimport { ShaderHelper } from '../material/shader/helper';\nimport type { Camera } from '../camera';\n\nconst SURFACE_MRT_FLAGS =\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\n MaterialVaryingFlags.SSS_STORE_PROFILE |\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\n MaterialVaryingFlags.SSS_STORE_NORMAL |\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\n MaterialVaryingFlags.SKIN_SSS_STORE;\nconst ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS =\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\n MaterialVaryingFlags.SSS_STORE_PROFILE |\n MaterialVaryingFlags.SSS_STORE_NORMAL;\n\n/**\n * Forward render pass\n * @internal\n */\nexport class LightPass extends RenderPass {\n /** @internal */\n protected _shadowMapHash: Nullable<string>;\n /** @internal */\n protected _transmission: boolean;\n /** @internal */\n protected _renderOpaque: boolean;\n /** @internal */\n protected _renderTransparent: boolean;\n /**\n * Creates an instance of ForwardRenderPass\n */\n constructor() {\n super(RENDER_PASS_TYPE_LIGHT);\n this._shadowMapHash = null;\n this._transmission = false;\n this._renderOpaque = true;\n this._renderTransparent = true;\n this._clearColor = Vector4.zero();\n }\n /** @internal */\n get transmission() {\n return this._transmission;\n }\n set transmission(val) {\n this._transmission = val;\n }\n /** @internal */\n get renderOpaque() {\n return this._renderOpaque;\n }\n set renderOpaque(val: boolean) {\n this._renderOpaque = !!val;\n }\n /** @internal */\n get renderTransparent() {\n return this._renderTransparent;\n }\n set renderTransparent(val: boolean) {\n this._renderTransparent = !!val;\n }\n /** @internal */\n protected getAdditiveLightPassColorAttachments(ctx: DrawContext, materialFlags: number) {\n const framebuffer = ctx.device.getFramebuffer();\n if (!framebuffer) {\n return null;\n }\n const attachments: any[] = [framebuffer.getColorAttachments()[0]];\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\n attachments.push(ctx.SSSDiffuseTexture!);\n }\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\n attachments.push(ctx.SSSTransmissionTexture!);\n }\n if (materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\n attachments.push(ctx.SkinSSSTexture!);\n }\n return attachments.length === 1 ? attachments[0] : attachments;\n }\n /** @internal */\n protected selectTransparentOITShadowLight(ctx: DrawContext, renderQueue: RenderQueue) {\n const shadowMapInfo = ctx.shadowMapInfo;\n if (!shadowMapInfo || shadowMapInfo.size === 0) {\n return null;\n }\n if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {\n return renderQueue.primaryDirectionalLight;\n }\n if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {\n return renderQueue.primaryTransmissionLight;\n }\n for (const light of renderQueue.shadowedLights) {\n if (shadowMapInfo.has(light)) {\n return light;\n }\n }\n return shadowMapInfo.keys().next().value ?? null;\n }\n /** @internal */\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\n return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\n ctx.lightBlending ? 1 : 0\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\n ctx\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\n ctx.HiZTexture?.uid ?? 0\n }`;\n }\n /** @internal */\n protected renderLightPass(\n ctx: DrawContext,\n camera: Camera,\n itemList: RenderItemListBundle,\n lights: PunctualLight[],\n flags: any\n ) {\n const baseLightPass = !ctx.lightBlending;\n ctx.drawEnvLight =\n baseLightPass &&\n ctx.env!.light.type !== 'none' &&\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\n if (!flags.cameraSet[ctx.renderPassHash]) {\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\n flags.cameraSet[ctx.renderPassHash] = 1;\n }\n if (ctx.currentShadowLight) {\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\n } else {\n if (!flags.lightSet[ctx.renderPassHash]) {\n ShaderHelper.setLightUniforms(\n bindGroup,\n ctx,\n ctx.clusteredLight!.clusterParam,\n ctx.clusteredLight!.countParam,\n ctx.clusteredLight!.lightBuffer!,\n ctx.clusteredLight!.lightIndexTexture!\n );\n flags.lightSet[ctx.renderPassHash] = 1;\n }\n }\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\n ShaderHelper.setFogUniforms(\n bindGroup,\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\n ctx.env!.sky.mappedFogType,\n baseLightPass ? 0 : 1,\n ctx.env!.sky.atmosphereParams,\n ctx.env!.sky.heightFogParams,\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\n );\n flags.fogSet[ctx.renderPassHash] = 1;\n }\n ctx.device.setBindGroup(0, bindGroup);\n const reverseWinding = camera.worldMatrixDet < 0;\n for (const lit of itemList.lit) {\n this.drawItemList(lit, ctx, reverseWinding);\n }\n if (!ctx.lightBlending) {\n for (const unlit of itemList.unlit) {\n this.drawItemList(unlit, ctx, reverseWinding);\n }\n }\n }\n /** @internal */\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\n ctx.renderPassHash = null;\n ctx.env = ctx.scene.env;\n ctx.drawEnvLight = false;\n ctx.flip = this.isAutoFlip(ctx);\n const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;\n const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\n const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\n const tmpFramebuffer = surfaceMRT\n ? ctx.device.pool.fetchTemporalFramebuffer(\n false,\n ctx.device.getDrawingBufferWidth(),\n ctx.device.getDrawingBufferHeight(),\n this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags)!,\n ctx.device.getFramebuffer()!.getDepthAttachment()\n )\n : null;\n const needsTransparentSingleColorFramebuffer =\n !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;\n const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer\n ? ctx.device.pool.fetchTemporalFramebuffer(\n false,\n ctx.device.getDrawingBufferWidth(),\n ctx.device.getDrawingBufferHeight(),\n this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags)!,\n ctx.device.getFramebuffer()!.getDepthAttachment()\n )\n : tmpFramebuffer;\n const oit =\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\n ? camera.oit\n : null;\n if (!oit && renderQueue.drawTransparent) {\n renderQueue.sortTransparentItems(camera.getWorldPosition());\n }\n const flags: any = {\n lightSet: {},\n cameraSet: {},\n fogSet: {}\n };\n const items = renderQueue.itemList;\n const lists = this._transmission\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\n : [items?.opaque, items?.transparent];\n for (let i = 0; i < lists.length; i++) {\n const isOpaquePass = i === 0;\n if ((isOpaquePass && !this._renderOpaque) || (!isOpaquePass && !this._renderTransparent)) {\n continue;\n }\n if (lists[i]) {\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\n ctx.oit = i === 0 || !items ? null : oit;\n const isolateTransparentABufferLightPasses =\n !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\n }\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\n for (let p = 0; p < numOitPasses; p++) {\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\n if (!ctx.oit.beginPass(ctx, p)) {\n continue;\n }\n }\n const runLightPass = (lights: PunctualLight[]) => {\n if (ctx.oit && isolateTransparentABufferLightPasses) {\n if (!ctx.oit.beginPass(ctx, p)) {\n return;\n }\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\n ctx.oit.endPass(ctx, p);\n } else {\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\n }\n };\n const runAdditiveLightPass = (lights: PunctualLight[]) => {\n const passFramebuffer =\n ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;\n if (ctx.lightBlending && passFramebuffer && !ctx.oit) {\n const savedMaterialFlags = ctx.materialFlags;\n ctx.materialFlags =\n ctx.queue === QUEUE_TRANSPARENT\n ? savedMaterialFlags & ~SURFACE_MRT_FLAGS\n : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\n ctx.device.pushDeviceStates();\n ctx.device.setFramebuffer(passFramebuffer);\n try {\n runLightPass(lights);\n } finally {\n ctx.materialFlags = savedMaterialFlags;\n ctx.device.popDeviceStates();\n }\n } else {\n runLightPass(lights);\n }\n };\n let lightIndex = 0;\n if (ctx.shadowMapInfo) {\n for (const k of ctx.shadowMapInfo.keys()) {\n ctx.currentShadowLight = k;\n ctx.lightBlending = lightIndex > 0;\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\n runAdditiveLightPass([k]);\n lightIndex++;\n }\n }\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\n ctx.currentShadowLight = null;\n ctx.lightBlending = lightIndex > 0;\n this._shadowMapHash = '';\n runAdditiveLightPass(renderQueue.unshadowedLights);\n }\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\n ctx.oit.endPass(ctx, p);\n }\n }\n if (ctx.oit) {\n ctx.oit.end(ctx);\n }\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\n }\n if (i === 0 && !ctx.sceneColorTexture) {\n if (tmpFramebuffer) {\n ctx.device.pushDeviceStates();\n ctx.device.setFramebuffer(tmpFramebuffer);\n }\n ctx.env.sky.renderSky(ctx);\n if (ctx.env.sky.fogPresents) {\n ctx.env.sky.renderFog(camera);\n }\n if (tmpFramebuffer) {\n ctx.device.popDeviceStates();\n }\n }\n // Post effects of all layers are built as render graph passes; the\n // opaque-layer chain runs between the opaque and transparent passes.\n }\n if (tmpFramebuffer) {\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\n }\n if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {\n ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);\n }\n ctx.oit = null;\n }\n}\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","getAdditiveLightPassColorAttachments","ctx","materialFlags","framebuffer","device","getFramebuffer","attachments","getColorAttachments","push","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","length","selectTransparentOITShadowLight","renderQueue","shadowMapInfo","size","primaryDirectionalLight","has","primaryTransmissionLight","light","shadowedLights","keys","next","value","_getGlobalBindGroupHash","camera","currentShadowLight","runtimeId","lightBlending","oit","calculateHash","env","getHash","linearDepthTexture","uid","sceneColorTexture","HiZTexture","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","scene","flip","isAutoFlip","surfaceMRT","additiveOpaqueMaterialFlags","additiveTransparentMaterialFlags","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getDepthAttachment","needsTransparentSingleColorFramebuffer","transparentTmpFramebuffer","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","i","isOpaquePass","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","isolateTransparentABufferLightPasses","getType","fogPresents","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderSky","renderFog","releaseFrameBuffer"],"mappings":"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"}
@@ -39,7 +39,6 @@ import { executeForwardPlusGraph } from './rendergraph/forward_plus_builder.js';
39
39
  device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);
40
40
  const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();
41
41
  const SSS = camera.SSS;
42
- const glossySurfaceFormat = halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';
43
42
  const ctx = {
44
43
  device,
45
44
  scene,
@@ -68,8 +67,10 @@ import { executeForwardPlusGraph } from './rendergraph/forward_plus_builder.js';
68
67
  SSR,
69
68
  SSS,
70
69
  SSRCalcThickness: SSR && camera.ssrCalcThickness,
71
- SSRRoughnessTexture: SSR ? device.pool.fetchTemporalTexture2D(true, glossySurfaceFormat, renderWidth, renderHeight) : null,
72
- SSRNormalTexture: SSR ? device.pool.fetchTemporalTexture2D(true, glossySurfaceFormat, renderWidth, renderHeight) : null,
70
+ // SSR roughness/normal MRT textures are render graph resources
71
+ // created by the LightPass; resolved into these fields at execution.
72
+ SSRRoughnessTexture: null,
73
+ SSRNormalTexture: null,
73
74
  SSSProfileTexture: null,
74
75
  SSSParamTexture: null,
75
76
  SSSDiffuseTexture: null,