@zephyr3d/scene 0.9.26 → 0.9.27
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.
- package/dist/animation/animationset.js +92 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/animation/skeleton.js +21 -1
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/asset/model.js +6 -2
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +75 -23
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +4764 -3600
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/material.js +296 -296
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -1
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/shader/helper.js +404 -3
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/water.js +2057 -72
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/motionblur.js +663 -58
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +46 -44
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/sss.js +30 -2
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/render/abuffer_oit.js +37 -37
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +156 -5
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +1 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +49 -49
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -3
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +57 -15
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +127 -20
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +6 -3
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/render_queue.js +36 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +4 -0
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +1 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +318 -9
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/underwater.js +624 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/water_caustics.js +1380 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/weightedblended_oit.js +33 -33
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/water.js +540 -4
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/water.js +22 -19
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +56 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/shadow_region.js +49 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +31 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +53 -25
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1101 -21
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/shprojector.js +87 -87
- package/dist/utility/shprojector.js.map +1 -1
- package/package.json +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +0 -41
- package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
- package/dist/shaders/ssgi.js +0 -63
- package/dist/shaders/ssgi.js.map +0 -1
- package/dist/shaders/ssgi_reprojection.js +0 -118
- package/dist/shaders/ssgi_reprojection.js.map +0 -1
package/dist/render/hzb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hzb.js","sources":["../../src/render/hzb.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BaseTexture,\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\nimport { DEPTH_FARTHEST, DEPTH_REDUCE_FARTHER } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram> = null;\r\nlet hzbBindGroupCache: WeakMap<BaseTexture, BindGroup[]> = new WeakMap();\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.x, 0, 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, DEPTH_FARTHEST, 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 // Furthest-depth reduction (max under standard Z, min under reverse Z).\r\n this.$l.maxDepth = pb[DEPTH_REDUCE_FARTHER](\r\n pb[DEPTH_REDUCE_FARTHER](this.d0.r, this.d1.r),\r\n pb[DEPTH_REDUCE_FARTHER](this.d2.r, this.d3.r)\r\n );\r\n this.$outputs.color = pb.vec4(this.maxDepth, 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 getHiZBindGroup(tex: BaseTexture, mip: number) {\r\n let info = hzbBindGroupCache.get(tex);\r\n if (!info) {\r\n info = [];\r\n hzbBindGroupCache.set(tex, info);\r\n }\r\n if (!info[mip]) {\r\n info[mip] = tex.device.createBindGroup(hzbProgram!.bindGroupLayouts[0]);\r\n srcSize[0] = Math.max(tex.width >> mip, 1);\r\n srcSize[1] = Math.max(tex.height >> mip, 1);\r\n info[mip].setValue('srcSize', srcSize);\r\n if (tex.device.type === 'webgpu') {\r\n info[mip].setTextureView('srcTex', tex, mip, 0, 1, fetchSampler('clamp_nearest'));\r\n } else {\r\n info[mip].setTexture('srcTex', tex, fetchSampler('clamp_nearest'));\r\n info[mip].setValue('srcMipLevel', mip);\r\n }\r\n }\r\n return info[mip];\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 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 device.setProgram(hzbProgram);\r\n device.setBindGroup(0, getHiZBindGroup(srcTexture, miplevel));\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 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","hzbBindGroupCache","WeakMap","blitter","srcSize","Int32Array","HiZInitBlitter","CopyBlitter","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","depth","$builder","vec4","x","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","DEPTH_FARTHEST","add","mul","xy","y","neg","fragment","color","tex2D","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","maxDepth","DEPTH_REDUCE_FARTHER","d0","r","d1","d2","d3","name","getHiZBindGroup","tex","mip","info","get","set","createBindGroup","bindGroupLayouts","Math","max","width","height","setValue","setTextureView","fetchSampler","setTexture","buildHiZLevel","miplevel","srcTexture","dstTexture","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","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 BaseTexture,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n Texture2D,\r\n TextureFormat\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\nimport { DEPTH_FARTHEST, DEPTH_REDUCE_CLOSER, DEPTH_REDUCE_FARTHER, REVERSE_Z } from '@zephyr3d/base';\r\n\r\nlet hzbProgram: Nullable<GPUProgram>[] = [];\r\nlet hzbBindGroupCache: WeakMap<BaseTexture, BindGroup[]> = new WeakMap();\r\nlet blitter: Nullable<HiZInitBlitter>[] = [];\r\nconst srcSize = new Int32Array(2);\r\n\r\n/**\r\n * Seeds mip 0 of the pyramid from the depth prepass.\r\n *\r\n * Both channels start from the same device depth: the pyramid only diverges\r\n * once the reductions run, one keeping the farthest sample of each 2x2 and the\r\n * other the nearest. `twoChannel` decides whether the nearest channel exists at\r\n * all - it is a second full mip chain's worth of bandwidth, so a frame that only\r\n * needs the occlusion pyramid does not carry it.\r\n */\r\nclass HiZInitBlitter extends CopyBlitter {\r\n private readonly _twoChannel: boolean;\r\n constructor(twoChannel: boolean) {\r\n super();\r\n this._twoChannel = twoChannel;\r\n }\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.x, this._twoChannel ? depth.x : 0, 0, 1);\r\n }\r\n /** @override */\r\n protected calcHash(): string {\r\n return `${super.calcHash()}:${this._twoChannel ? 1 : 0}`;\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\n/**\r\n * Texture format for the Hi-Z pyramid.\r\n *\r\n * Half float under reverse-Z and full float otherwise, because reverse-Z spends\r\n * float's relative precision where the depth is: a 16-bit mantissa there is\r\n * worth a few centimetres at a hundred metres, while a linear-Z half float\r\n * would quantise the near field into steps.\r\n *\r\n * `withNearest` adds the nearest-depth channel. It doubles the pyramid's\r\n * bandwidth, so it is only requested by a frame that has a consumer for it.\r\n */\r\nexport function getHiZFormat(withNearest: boolean): TextureFormat {\r\n if (withNearest) {\r\n return REVERSE_Z ? 'rg16f' : 'rg32f';\r\n }\r\n return REVERSE_Z ? 'r16f' : 'r32f';\r\n}\r\n\r\n/** Whether a Hi-Z texture of this format carries the nearest-depth channel. */\r\nexport function hasNearestChannel(format: TextureFormat): boolean {\r\n return format === 'rg16f' || format === 'rg32f';\r\n}\r\n\r\nfunction buildHZBProgram(device: AbstractDevice, twoChannel: boolean) {\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, DEPTH_FARTHEST, 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 // Furthest-depth reduction (max under standard Z, min under reverse Z).\r\n // This is the conservative direction for occlusion: a cell reports the\r\n // depth nothing behind it can be in front of.\r\n this.$l.maxDepth = pb[DEPTH_REDUCE_FARTHER](\r\n pb[DEPTH_REDUCE_FARTHER](this.d0.r, this.d1.r),\r\n pb[DEPTH_REDUCE_FARTHER](this.d2.r, this.d3.r)\r\n );\r\n if (twoChannel) {\r\n // Nearest-depth reduction, from the green channel. The opposite\r\n // conservative direction, and the one a proximity query needs: a cell\r\n // reports the closest surface anywhere inside it, so a query that\r\n // covers the cell cannot miss geometry that is in there.\r\n this.$l.minDepth = pb[DEPTH_REDUCE_CLOSER](\r\n pb[DEPTH_REDUCE_CLOSER](this.d0.g, this.d1.g),\r\n pb[DEPTH_REDUCE_CLOSER](this.d2.g, this.d3.g)\r\n );\r\n this.$outputs.color = pb.vec4(this.maxDepth, this.minDepth, 0, 1);\r\n } else {\r\n this.$outputs.color = pb.vec4(this.maxDepth, 0, 0, 1);\r\n }\r\n });\r\n }\r\n })!;\r\n program.name = `@HZB_Builder${twoChannel ? '_MinMax' : ''}`;\r\n return program;\r\n}\r\n\r\nfunction getHiZBindGroup(tex: BaseTexture, mip: number, program: GPUProgram) {\r\n let info = hzbBindGroupCache.get(tex);\r\n if (!info) {\r\n info = [];\r\n hzbBindGroupCache.set(tex, info);\r\n }\r\n if (!info[mip]) {\r\n info[mip] = tex.device.createBindGroup(program.bindGroupLayouts[0]);\r\n srcSize[0] = Math.max(tex.width >> mip, 1);\r\n srcSize[1] = Math.max(tex.height >> mip, 1);\r\n info[mip].setValue('srcSize', srcSize);\r\n if (tex.device.type === 'webgpu') {\r\n info[mip].setTextureView('srcTex', tex, mip, 0, 1, fetchSampler('clamp_nearest'));\r\n } else {\r\n info[mip].setTexture('srcTex', tex, fetchSampler('clamp_nearest'));\r\n info[mip].setValue('srcMipLevel', mip);\r\n }\r\n }\r\n return info[mip];\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 program: GPUProgram\r\n) {\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 device.setProgram(program);\r\n device.setBindGroup(0, getHiZBindGroup(srcTexture, miplevel, program));\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\n/**\r\n * Builds the Hi-Z pyramid from the depth prepass.\r\n *\r\n * The target's channel count picks the variant: a one-channel target carries\r\n * only the farthest-depth pyramid the occlusion tests want, a two-channel one\r\n * adds the nearest-depth pyramid in green for proximity queries. Keyed off the\r\n * texture rather than a flag so the pyramid and its consumer cannot disagree\r\n * about what is in green.\r\n */\r\nexport function buildHiZ(sourceTex: Texture2D, HiZFrameBuffer: FrameBuffer) {\r\n const device = getDevice();\r\n const dstTex = HiZFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n const twoChannel = hasNearestChannel(dstTex.format);\r\n const variant = twoChannel ? 1 : 0;\r\n if (!hzbProgram[variant]) {\r\n hzbProgram[variant] = buildHZBProgram(device, twoChannel);\r\n blitter[variant] = new HiZInitBlitter(twoChannel);\r\n }\r\n const program = hzbProgram[variant]!;\r\n blitter[variant]!.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, program);\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 tmpTex = tmpFramebuffer.getColorAttachments()[0] as Texture2D;\r\n for (let i = 0; i < srcTex.mipLevelCount - 1; i++) {\r\n buildHiZLevel(device, i, srcTex, tmpTex, program);\r\n }\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n device.popDeviceStates();\r\n}\r\n"],"names":["hzbProgram","hzbBindGroupCache","WeakMap","blitter","srcSize","Int32Array","HiZInitBlitter","CopyBlitter","_twoChannel","twoChannel","filter","scope","type","srcTex","srcUV","srcLayer","sampleType","depth","$builder","vec4","x","calcHash","getHiZFormat","withNearest","REVERSE_Z","hasNearestChannel","format","buildHZBProgram","device","program","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","DEPTH_FARTHEST","add","mul","xy","y","neg","fragment","color","tex2D","uniform","ivec2","srcMipLevel","int","$l","coord","fragCoord","minCoord","maxCoord","sub","i","textureLoad","clamp","maxDepth","DEPTH_REDUCE_FARTHER","d0","r","d1","d2","d3","minDepth","DEPTH_REDUCE_CLOSER","g","name","getHiZBindGroup","tex","mip","info","get","set","createBindGroup","bindGroupLayouts","Math","max","width","height","setValue","setTextureView","fetchSampler","setTexture","buildHiZLevel","miplevel","srcTexture","dstTexture","framebuffer","pool","fetchTemporalFramebuffer","setColorAttachmentGenerateMipmaps","setProgram","setBindGroup","setFramebuffer","drawFullscreenQuad","copyFramebufferToTexture2D","releaseFrameBuffer","buildHiZ","sourceTex","HiZFrameBuffer","getDevice","dstTex","getColorAttachments","variant","blit","pushDeviceStates","mipLevelCount","tmpFramebuffer","getWidth","getHeight","tmpTex","popDeviceStates"],"mappings":"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"}
|
package/dist/render/lightpass.js
CHANGED
|
@@ -87,11 +87,11 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUG
|
|
|
87
87
|
return shadowMapInfo.keys().next().value ?? null;
|
|
88
88
|
}
|
|
89
89
|
/** @internal */ _getGlobalBindGroupHash(ctx, camera) {
|
|
90
|
-
return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}`;
|
|
90
|
+
return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0}`;
|
|
91
91
|
}
|
|
92
92
|
/** @internal */ _getShaderVariantHash(ctx, camera) {
|
|
93
93
|
const textureVariant = (texture)=>texture ? `1:${texture.format}` : '0';
|
|
94
|
-
return `LightPassShaderVariant:${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${textureVariant(ctx.linearDepthTexture)}:${textureVariant(ctx.sceneColorTexture)}:${textureVariant(ctx.HiZTexture)}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}`;
|
|
94
|
+
return `LightPassShaderVariant:${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${textureVariant(ctx.linearDepthTexture)}:${textureVariant(ctx.sceneColorTexture)}:${textureVariant(ctx.HiZTexture)}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0}`;
|
|
95
95
|
}
|
|
96
96
|
/** @internal */ renderLightPass(ctx, camera, itemList, lights, flags) {
|
|
97
97
|
const baseLightPass = !ctx.lightBlending;
|
|
@@ -183,7 +183,10 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SCENE_STORE_ROUG
|
|
|
183
183
|
ctx.shadowMaskClusterSample = useShadowMaskQueue;
|
|
184
184
|
ctx.oit = i === 0 || !items ? null : oit;
|
|
185
185
|
const isolateTransparentABufferLightPasses = !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';
|
|
186
|
-
|
|
186
|
+
// Transparent geometry fogs itself, the screen-space pass over the opaque
|
|
187
|
+
// scene being unable to reach it. Suppressed while submerged for the same
|
|
188
|
+
// reason the screen-space one is: the medium is water, not air.
|
|
189
|
+
if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents && !ctx.underwater) {
|
|
187
190
|
ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;
|
|
188
191
|
}
|
|
189
192
|
const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;
|
|
@@ -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 type { Texture2D } from '@zephyr3d/device';\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 type { Camera } from '../camera';\r\n\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_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.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SCENE_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 /** @internal */\r\n protected _renderSky: 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._renderSky = 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 get renderSky() {\r\n return this._renderSky;\r\n }\r\n set renderSky(val: boolean) {\r\n this._renderSky = !!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 }:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}`;\r\n }\r\n /** @internal */\r\n protected _getShaderVariantHash(ctx: DrawContext, camera: Camera) {\r\n const textureVariant = (texture: Texture2D | null | undefined) => (texture ? `1:${texture.format}` : '0');\r\n return `LightPassShaderVariant:${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}:${textureVariant(ctx.linearDepthTexture)}:${textureVariant(\r\n ctx.sceneColorTexture\r\n )}:${textureVariant(ctx.HiZTexture)}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}`;\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 ctx.shaderVariantHash = this._getShaderVariantHash(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 // Bind the per-queue cluster shadow-mask mode every call (not cached with\r\n // lightSet): the same clustered program/bind group may serve both the opaque\r\n // (sample mask) and transparent (skip shadow lights) queues.\r\n if (ctx.screenSpaceShadowMask) {\r\n ShaderHelper.setShadowMaskMode(bindGroup, !!ctx.shadowMaskClusterSample);\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.shaderVariantHash = 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 // Sort only when this invocation actually draws the transparent queue.\r\n // The opaque pass (and the SSS-profile pass) run with _renderTransparent\r\n // === false; without this guard they would sort the transparent lists\r\n // pointlessly, and the real transparent pass would then sort them again.\r\n if (!oit && renderQueue.drawTransparent && this._renderTransparent) {\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 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 // The screen-space shadow mask is only valid for the opaque depth-prepass\r\n // geometry: lists[0] in non-transmission mode. For that queue, shadow lights\r\n // are lit via the clustered pass sampling the mask (additive passes skipped).\r\n // Every other queue (transparent/OIT hair, transmission) keeps the inline\r\n // additive shadow path, where shadows are sampled per-fragment at the real\r\n // surface depth.\r\n const useShadowMaskQueue = ctx.screenSpaceShadowMask && !this._transmission && i === 0;\r\n ctx.shadowMaskClusterSample = useShadowMaskQueue;\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 // Run the per-shadowed-light additive passes unless this queue uses the\r\n // screen-space shadow mask (opaque). Transparent/transmission queues keep\r\n // the inline additive shadow path even when the mask is enabled.\r\n if (!useShadowMaskQueue && 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 && this._renderSky) {\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 // Post effects of all layers are built as render graph passes; the\r\n // opaque-layer chain runs between the opaque and transparent passes.\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","SCENE_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SCENE_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_renderSky","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","renderSky","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","screenSpaceShadowMask","scene","lightingMode","_getShaderVariantHash","textureVariant","texture","format","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","shaderVariantHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","setShadowMaskMode","shadowMaskClusterSample","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","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","useShadowMaskQueue","isolateTransparentABufferLightPasses","getType","fogPresents","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderFog","releaseFrameBuffer"],"mappings":"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"}
|
|
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 type { Texture2D } from '@zephyr3d/device';\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 type { Camera } from '../camera';\r\n\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_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.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SCENE_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 /** @internal */\r\n protected _renderSky: 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._renderSky = 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 get renderSky() {\r\n return this._renderSky;\r\n }\r\n set renderSky(val: boolean) {\r\n this._renderSky = !!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 }:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${\r\n ShaderHelper.usesWaterCaustics(ctx) ? 1 : 0\r\n }`;\r\n }\r\n /** @internal */\r\n protected _getShaderVariantHash(ctx: DrawContext, camera: Camera) {\r\n const textureVariant = (texture: Texture2D | null | undefined) => (texture ? `1:${texture.format}` : '0');\r\n return `LightPassShaderVariant:${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}:${textureVariant(ctx.linearDepthTexture)}:${textureVariant(\r\n ctx.sceneColorTexture\r\n )}:${textureVariant(ctx.HiZTexture)}:${ctx.screenSpaceShadowMask ? 1 : 0}:${ctx.scene.lightingMode}:${\r\n ShaderHelper.usesWaterCaustics(ctx) ? 1 : 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 ctx.shaderVariantHash = this._getShaderVariantHash(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 // Bind the per-queue cluster shadow-mask mode every call (not cached with\r\n // lightSet): the same clustered program/bind group may serve both the opaque\r\n // (sample mask) and transparent (skip shadow lights) queues.\r\n if (ctx.screenSpaceShadowMask) {\r\n ShaderHelper.setShadowMaskMode(bindGroup, !!ctx.shadowMaskClusterSample);\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.shaderVariantHash = 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 // Sort only when this invocation actually draws the transparent queue.\r\n // The opaque pass (and the SSS-profile pass) run with _renderTransparent\r\n // === false; without this guard they would sort the transparent lists\r\n // pointlessly, and the real transparent pass would then sort them again.\r\n if (!oit && renderQueue.drawTransparent && this._renderTransparent) {\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 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 // The screen-space shadow mask is only valid for the opaque depth-prepass\r\n // geometry: lists[0] in non-transmission mode. For that queue, shadow lights\r\n // are lit via the clustered pass sampling the mask (additive passes skipped).\r\n // Every other queue (transparent/OIT hair, transmission) keeps the inline\r\n // additive shadow path, where shadows are sampled per-fragment at the real\r\n // surface depth.\r\n const useShadowMaskQueue = ctx.screenSpaceShadowMask && !this._transmission && i === 0;\r\n ctx.shadowMaskClusterSample = useShadowMaskQueue;\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 // Transparent geometry fogs itself, the screen-space pass over the opaque\r\n // scene being unable to reach it. Suppressed while submerged for the same\r\n // reason the screen-space one is: the medium is water, not air.\r\n if (\r\n (ctx.queue === QUEUE_TRANSPARENT || this._transmission) &&\r\n ctx.scene.env.sky.fogPresents &&\r\n !ctx.underwater\r\n ) {\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 // Run the per-shadowed-light additive passes unless this queue uses the\r\n // screen-space shadow mask (opaque). Transparent/transmission queues keep\r\n // the inline additive shadow path even when the mask is enabled.\r\n if (!useShadowMaskQueue && 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 && this._renderSky) {\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 // Post effects of all layers are built as render graph passes; the\r\n // opaque-layer chain runs between the opaque and transparent passes.\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","SCENE_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SCENE_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_renderSky","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","renderSky","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","screenSpaceShadowMask","scene","lightingMode","ShaderHelper","usesWaterCaustics","_getShaderVariantHash","textureVariant","texture","format","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","shaderVariantHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","setShadowMaskMode","shadowMaskClusterSample","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","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","useShadowMaskQueue","isolateTransparentABufferLightPasses","getType","fogPresents","underwater","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderFog","releaseFrameBuffer"],"mappings":"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"}
|
package/dist/render/oit.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { Disposable } from '@zephyr3d/base';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Abstract class for order-independent transparency renderers.
|
|
5
|
-
*
|
|
6
|
-
* Order-independent transparency (OIT) renderers allow for rendering
|
|
7
|
-
* of transparent objects in any order, regardless of their depth.
|
|
8
|
-
*
|
|
9
|
-
* This abstract class defines the common interface for all OIT renderers.
|
|
10
|
-
* Specific implementations of OIT renderers should extend this class and
|
|
11
|
-
* provide concrete implementations for the abstract methods.
|
|
12
|
-
*
|
|
13
|
-
* @public
|
|
3
|
+
/**
|
|
4
|
+
* Abstract class for order-independent transparency renderers.
|
|
5
|
+
*
|
|
6
|
+
* Order-independent transparency (OIT) renderers allow for rendering
|
|
7
|
+
* of transparent objects in any order, regardless of their depth.
|
|
8
|
+
*
|
|
9
|
+
* This abstract class defines the common interface for all OIT renderers.
|
|
10
|
+
* Specific implementations of OIT renderers should extend this class and
|
|
11
|
+
* provide concrete implementations for the abstract methods.
|
|
12
|
+
*
|
|
13
|
+
* @public
|
|
14
14
|
*/ class OIT extends Disposable {
|
|
15
15
|
_uniformTag;
|
|
16
16
|
constructor(){
|
package/dist/render/oit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oit.js","sources":["../../src/render/oit.ts"],"sourcesContent":["import type {\n BindGroup,\n PBGlobalScope,\n PBInsideFunctionScope,\n PBShaderExp,\n RenderStateSet\n} from '@zephyr3d/device';\nimport type { DrawContext } from './drawable';\nimport { Disposable } from '@zephyr3d/base';\n\n/**\n * Abstract class for order-independent transparency renderers.\n *\n * Order-independent transparency (OIT) renderers allow for rendering\n * of transparent objects in any order, regardless of their depth.\n *\n * This abstract class defines the common interface for all OIT renderers.\n * Specific implementations of OIT renderers should extend this class and\n * provide concrete implementations for the abstract methods.\n *\n * @public\n */\nexport abstract class OIT extends Disposable {\n private _uniformTag: number;\n constructor() {\n super();\n this._uniformTag = 0;\n }\n get uniformTag() {\n return this._uniformTag;\n }\n uniformChanged() {\n this._uniformTag++;\n }\n /**\n * Returns the type of the renderer.\n *\n * @returns The type of the renderer.\n */\n abstract getType(): string;\n /**\n * Checks whether the renderer supports the given device type.\n *\n * @param deviceType - The device type.\n * @returns True if the renderer supports the device type, false otherwise.\n */\n abstract supportDevice(deviceType: string): boolean;\n /**\n * Whether this OIT algorithm wants pre-multiplied alpha\n *\n * @returns True if the OIT wants pre-multiplied alpha, false otherwise\n */\n abstract wantsPremultipliedAlpha(): boolean;\n /**\n * Begins rendering the transparent objects.\n *\n * @remarks\n * Contract: the caller (the transparent scene pass) must have explicitly\n * bound the transparent scene target framebuffer before calling begin(),\n * beginPass() or endPass(). Implementations may redirect rendering to\n * internal buffers, but must composite into that bound target and restore\n * it before returning.\n *\n * @param ctx - The draw context.\n * @returns The number of passes required for rendering.\n */\n abstract begin(ctx: DrawContext): number;\n /**\n * Ends rendering the transparent objects.\n *\n * @param ctx - The draw context.\n */\n abstract end(ctx: DrawContext): void;\n /**\n * Begins rendering for the given pass.\n *\n * @param ctx - The draw context.\n * @param pass - The pass number.\n * @returns True if the transparent objects should be rendered, false otherwise.\n */\n abstract beginPass(ctx: DrawContext, pass: number): boolean;\n /**\n * Ends rendering for the given pass.\n *\n * @param ctx - The draw context.\n * @param pass - The pass number.\n */\n abstract endPass(ctx: DrawContext, pass: number): void;\n /**\n * Sets up the fragment output.\n *\n * @remarks\n * This method declares necessary uniform variables for OIT rendering and injects it into the object's material.\n *\n * @param scope - The global shader scope.\n */\n abstract setupFragmentOutput(scope: PBGlobalScope): void;\n /**\n * Do the fragment color output.\n *\n * @remarks\n * This method outputs the calculated fragment color for OIT rendering and injects it into the object's material.\n *\n * @param scope - The global shader scope.\n * @param color - The calculated fragment color.\n */\n abstract outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext): boolean;\n /**\n * Applies the uniforms for the given draw context and bind group.\n *\n * This function will be called when ever the transparent material will upload uniform variables.\n *\n * @param ctx - The draw context.\n * @param bindGroup - The bind group.\n */\n abstract applyUniforms(ctx: DrawContext, bindGroup: BindGroup): void;\n /**\n * Whether additive light passes should keep the material alpha before OIT output.\n *\n * @remarks\n * Some OIT algorithms need the original material alpha to weight additive light color,\n * but write zero alpha to their accumulation targets so transmittance is not counted twice.\n */\n abstract wantsAdditiveLightPassAlpha(): boolean;\n /**\n * Calculates the hash of the renderer.\n *\n * @remarks\n * When this hash value was changed, material shader will be forced recreate.\n *\n * @returns The hash of the renderer.\n */\n abstract calculateHash(): string;\n /**\n * Sets the render states for the renderer.\n *\n * This function will be called when the transparent object will be rendered.\n *\n * @param rs - The render states.\n */\n abstract setRenderStates(rs: RenderStateSet): void;\n}\n"],"names":["OIT","Disposable","_uniformTag","uniformTag","uniformChanged"],"mappings":";;AAUA;;;;;;;;;;;IAYO,MAAeA,GAAYC,SAAAA,UAAAA,CAAAA;IACxBC,WAAoB;IAC5B,WAAc,EAAA;QACZ,KAAK,EAAA;QACL,IAAI,CAACA,WAAW,GAAG,CAAA;AACrB;AACA,IAAA,IAAIC,UAAa,GAAA;QACf,OAAO,IAAI,CAACD,WAAW;AACzB;IACAE,cAAiB,GAAA;AACf,QAAA,IAAI,CAACF,WAAW,EAAA;AAClB;AA4GF;;;;"}
|
|
1
|
+
{"version":3,"file":"oit.js","sources":["../../src/render/oit.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport { Disposable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Abstract class for order-independent transparency renderers.\r\n *\r\n * Order-independent transparency (OIT) renderers allow for rendering\r\n * of transparent objects in any order, regardless of their depth.\r\n *\r\n * This abstract class defines the common interface for all OIT renderers.\r\n * Specific implementations of OIT renderers should extend this class and\r\n * provide concrete implementations for the abstract methods.\r\n *\r\n * @public\r\n */\r\nexport abstract class OIT extends Disposable {\r\n private _uniformTag: number;\r\n constructor() {\r\n super();\r\n this._uniformTag = 0;\r\n }\r\n get uniformTag() {\r\n return this._uniformTag;\r\n }\r\n uniformChanged() {\r\n this._uniformTag++;\r\n }\r\n /**\r\n * Returns the type of the renderer.\r\n *\r\n * @returns The type of the renderer.\r\n */\r\n abstract getType(): string;\r\n /**\r\n * Checks whether the renderer supports the given device type.\r\n *\r\n * @param deviceType - The device type.\r\n * @returns True if the renderer supports the device type, false otherwise.\r\n */\r\n abstract supportDevice(deviceType: string): boolean;\r\n /**\r\n * Whether this OIT algorithm wants pre-multiplied alpha\r\n *\r\n * @returns True if the OIT wants pre-multiplied alpha, false otherwise\r\n */\r\n abstract wantsPremultipliedAlpha(): boolean;\r\n /**\r\n * Begins rendering the transparent objects.\r\n *\r\n * @remarks\r\n * Contract: the caller (the transparent scene pass) must have explicitly\r\n * bound the transparent scene target framebuffer before calling begin(),\r\n * beginPass() or endPass(). Implementations may redirect rendering to\r\n * internal buffers, but must composite into that bound target and restore\r\n * it before returning.\r\n *\r\n * @param ctx - The draw context.\r\n * @returns The number of passes required for rendering.\r\n */\r\n abstract begin(ctx: DrawContext): number;\r\n /**\r\n * Ends rendering the transparent objects.\r\n *\r\n * @param ctx - The draw context.\r\n */\r\n abstract end(ctx: DrawContext): void;\r\n /**\r\n * Begins rendering for the given pass.\r\n *\r\n * @param ctx - The draw context.\r\n * @param pass - The pass number.\r\n * @returns True if the transparent objects should be rendered, false otherwise.\r\n */\r\n abstract beginPass(ctx: DrawContext, pass: number): boolean;\r\n /**\r\n * Ends rendering for the given pass.\r\n *\r\n * @param ctx - The draw context.\r\n * @param pass - The pass number.\r\n */\r\n abstract endPass(ctx: DrawContext, pass: number): void;\r\n /**\r\n * Sets up the fragment output.\r\n *\r\n * @remarks\r\n * This method declares necessary uniform variables for OIT rendering and injects it into the object's material.\r\n *\r\n * @param scope - The global shader scope.\r\n */\r\n abstract setupFragmentOutput(scope: PBGlobalScope): void;\r\n /**\r\n * Do the fragment color output.\r\n *\r\n * @remarks\r\n * This method outputs the calculated fragment color for OIT rendering and injects it into the object's material.\r\n *\r\n * @param scope - The global shader scope.\r\n * @param color - The calculated fragment color.\r\n */\r\n abstract outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext): boolean;\r\n /**\r\n * Applies the uniforms for the given draw context and bind group.\r\n *\r\n * This function will be called when ever the transparent material will upload uniform variables.\r\n *\r\n * @param ctx - The draw context.\r\n * @param bindGroup - The bind group.\r\n */\r\n abstract applyUniforms(ctx: DrawContext, bindGroup: BindGroup): void;\r\n /**\r\n * Whether additive light passes should keep the material alpha before OIT output.\r\n *\r\n * @remarks\r\n * Some OIT algorithms need the original material alpha to weight additive light color,\r\n * but write zero alpha to their accumulation targets so transmittance is not counted twice.\r\n */\r\n abstract wantsAdditiveLightPassAlpha(): boolean;\r\n /**\r\n * Calculates the hash of the renderer.\r\n *\r\n * @remarks\r\n * When this hash value was changed, material shader will be forced recreate.\r\n *\r\n * @returns The hash of the renderer.\r\n */\r\n abstract calculateHash(): string;\r\n /**\r\n * Sets the render states for the renderer.\r\n *\r\n * This function will be called when the transparent object will be rendered.\r\n *\r\n * @param rs - The render states.\r\n */\r\n abstract setRenderStates(rs: RenderStateSet): void;\r\n}\r\n"],"names":["OIT","Disposable","_uniformTag","uniformTag","uniformChanged"],"mappings":";;AAUA;;;;;;;;;;;IAYO,MAAeA,GAAYC,SAAAA,UAAAA,CAAAA;IACxBC,WAAoB;IAC5B,WAAc,EAAA;QACZ,KAAK,EAAA;QACL,IAAI,CAACA,WAAW,GAAG,CAAA;AACrB;AACA,IAAA,IAAIC,UAAa,GAAA;QACf,OAAO,IAAI,CAACD,WAAW;AACzB;IACAE,cAAiB,GAAA;AACf,QAAA,IAAI,CAACF,WAAW,EAAA;AAClB;AA4GF;;;;"}
|
|
@@ -100,11 +100,20 @@ const tmpDrawablePos = new Vector3();
|
|
|
100
100
|
/** @internal */ _sunLight;
|
|
101
101
|
/** @internal */ _primaryDirectionalLight;
|
|
102
102
|
/** @internal */ _primaryTransmissionLight;
|
|
103
|
+
/**
|
|
104
|
+
* Visible water surfaces, in visit order.
|
|
105
|
+
*
|
|
106
|
+
* Collected separately from the item lists so passes that run before the light
|
|
107
|
+
* pass - the caustics pass, which has to know where the water plane is before
|
|
108
|
+
* anything shades under it - can find them without walking every draw item.
|
|
109
|
+
* @internal
|
|
110
|
+
*/ _waterList;
|
|
103
111
|
/** @internal */ _bindGroupAllocator;
|
|
104
112
|
/** @internal */ _ref;
|
|
105
113
|
/** @internal */ _instanceInfo;
|
|
106
114
|
/** @internal */ _needSceneColor;
|
|
107
115
|
_needSceneDepth;
|
|
116
|
+
_needHiZNearest;
|
|
108
117
|
_needSceneColorWithDepth;
|
|
109
118
|
/** @internal */ _drawTransparent;
|
|
110
119
|
/** @internal */ _objectColorMaps;
|
|
@@ -121,6 +130,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
121
130
|
this._sunLight = null;
|
|
122
131
|
this._primaryDirectionalLight = null;
|
|
123
132
|
this._primaryTransmissionLight = null;
|
|
133
|
+
this._waterList = [];
|
|
124
134
|
this._ref = {
|
|
125
135
|
ref: this,
|
|
126
136
|
valid: true
|
|
@@ -128,6 +138,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
128
138
|
this._instanceInfo = new Map();
|
|
129
139
|
this._needSceneColor = false;
|
|
130
140
|
this._needSceneDepth = false;
|
|
141
|
+
this._needHiZNearest = false;
|
|
131
142
|
this._needSceneColorWithDepth = false;
|
|
132
143
|
this._drawTransparent = false;
|
|
133
144
|
this._objectColorMaps = [
|
|
@@ -168,6 +179,17 @@ const tmpDrawablePos = new Vector3();
|
|
|
168
179
|
/** @internal */ needSceneDepth() {
|
|
169
180
|
return this._needSceneDepth;
|
|
170
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Whether any drawable needs the Hi-Z pyramid's nearest-depth channel.
|
|
184
|
+
*
|
|
185
|
+
* Materials request it the way they request the scene colour and depth, which
|
|
186
|
+
* is what lets a surface that queries the scene's proximity - water foam
|
|
187
|
+
* against a shoreline or a piling - turn the second channel on without the
|
|
188
|
+
* application having to know it exists.
|
|
189
|
+
* @internal
|
|
190
|
+
*/ needHiZNearest() {
|
|
191
|
+
return this._needHiZNearest;
|
|
192
|
+
}
|
|
171
193
|
/** @internal */ needSceneColorWithDepth() {
|
|
172
194
|
return this._needSceneColorWithDepth;
|
|
173
195
|
}
|
|
@@ -187,6 +209,15 @@ const tmpDrawablePos = new Vector3();
|
|
|
187
209
|
*/ get shadowedLights() {
|
|
188
210
|
return this._shadowedLightList;
|
|
189
211
|
}
|
|
212
|
+
/** Visible water surfaces collected while culling. */ get waters() {
|
|
213
|
+
return this._waterList;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Record a visible water surface.
|
|
217
|
+
* @param water - The water node that passed culling.
|
|
218
|
+
*/ pushWater(water) {
|
|
219
|
+
this._waterList.push(water);
|
|
220
|
+
}
|
|
190
221
|
/**
|
|
191
222
|
* Gets the unshadowed lights
|
|
192
223
|
*/ get unshadowedLights() {
|
|
@@ -236,6 +267,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
236
267
|
* Push items from another render queue
|
|
237
268
|
* @param queue - The render queue to be pushed
|
|
238
269
|
*/ pushRenderQueue(queue) {
|
|
270
|
+
this._waterList.push(...queue._waterList);
|
|
239
271
|
const newItemLists = queue._itemList;
|
|
240
272
|
if (!newItemLists) {
|
|
241
273
|
return;
|
|
@@ -253,6 +285,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
253
285
|
this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);
|
|
254
286
|
this._needSceneColor ||= queue._needSceneColor;
|
|
255
287
|
this._needSceneDepth ||= queue._needSceneDepth;
|
|
288
|
+
this._needHiZNearest ||= queue._needHiZNearest;
|
|
256
289
|
this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;
|
|
257
290
|
this._drawTransparent ||= queue._drawTransparent;
|
|
258
291
|
this._sunLight ||= queue._sunLight;
|
|
@@ -281,6 +314,7 @@ const tmpDrawablePos = new Vector3();
|
|
|
281
314
|
const transmission = !!drawable.needSceneColor() || needDepth;
|
|
282
315
|
this._needSceneColor ||= transmission;
|
|
283
316
|
this._needSceneDepth ||= drawable.needSceneDepth();
|
|
317
|
+
this._needHiZNearest ||= !!drawable.needHiZNearest?.();
|
|
284
318
|
this._needSceneColorWithDepth ||= transmission && needDepth;
|
|
285
319
|
this._drawTransparent ||= trans;
|
|
286
320
|
if (camera.getPickResultResolveFunc()) {
|
|
@@ -385,8 +419,10 @@ const tmpDrawablePos = new Vector3();
|
|
|
385
419
|
this._sunLight = null;
|
|
386
420
|
this._primaryDirectionalLight = null;
|
|
387
421
|
this._primaryTransmissionLight = null;
|
|
422
|
+
this._waterList = [];
|
|
388
423
|
this._needSceneColor = false;
|
|
389
424
|
this._needSceneDepth = false;
|
|
425
|
+
this._needHiZNearest = false;
|
|
390
426
|
this._needSceneColorWithDepth = false;
|
|
391
427
|
this._drawTransparent = false;
|
|
392
428
|
}
|