Documentation
    Preparing search index...

    Variable PARTICLE_APPEARANCE_SHADER_SOURCEConst

    PARTICLE_APPEARANCE_SHADER_SOURCE: "struct ParticleUniforms {\n projection : mat4x4<f32>,\n view : mat4x4<f32>,\n model : mat4x4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> draw : ParticleUniforms;\n\nstruct AppearanceUniforms {\n useMap : f32,\n hasSceneDepth : f32,\n pad0 : f32,\n pad1 : f32,\n};\n\n@group(0) @binding(1) var<uniform> appearance : AppearanceUniforms;\n@group(1) @binding(0) var mapTexture : texture_2d<f32>;\n@group(1) @binding(1) var mapSampler : sampler;\n@group(1) @binding(2) var sceneDepth : texture_2d<f32>;\n\nstruct AppearanceVertexOutput {\n @builtin(position) position : vec4<f32>,\n @location(0) color : vec4<f32>,\n @location(1) uv : vec2<f32>,\n @location(2) softness : f32,\n @location(3) viewZ : f32,\n};\n\n@vertex\nfn vertexMain(\n @location(0) corner : vec3<f32>,\n @location(1) instancePosition : vec3<f32>,\n @location(2) instanceSize : f32,\n @location(3) instanceColor : vec4<f32>,\n @location(4) instanceRotation : f32,\n @location(5) instanceSoftness : f32,\n) -> AppearanceVertexOutput {\n var output : AppearanceVertexOutput;\n var center = draw.view * draw.model * vec4<f32>(instancePosition, 1.0);\n let c = cos(instanceRotation);\n let s = sin(instanceRotation);\n let rx = corner.x * c - corner.y * s;\n let ry = corner.x * s + corner.y * c;\n center.x = center.x + rx * instanceSize;\n center.y = center.y + ry * instanceSize;\n let clip = draw.projection * center;\n output.position = vec4<f32>(clip.x, clip.y, (clip.z + clip.w) * 0.5, clip.w);\n output.color = instanceColor;\n output.uv = vec2<f32>(corner.x + 0.5, corner.y + 0.5);\n output.softness = instanceSoftness;\n output.viewZ = center.z;\n return output;\n}\n\n@fragment\nfn fragmentMain(input : AppearanceVertexOutput) -> @location(0) vec4<f32> {\n var color = input.color;\n if (appearance.useMap > 0.5) {\n color = color * textureSample(mapTexture, mapSampler, input.uv);\n }\n var fade = 1.0;\n if (input.softness > 0.0) {\n if (appearance.hasSceneDepth > 0.5) {\n let sceneZ = textureSample(sceneDepth, mapSampler, input.position.xy).r;\n fade = clamp(abs(sceneZ - input.position.z) / max(input.softness, 1e-5), 0.0, 1.0);\n } else {\n fade = clamp(1.0 - abs(input.viewZ) * input.softness, 0.0, 1.0);\n }\n }\n color.a = color.a * fade;\n return color;\n}\n"

    R-32 appearance WGSL — textured / rotated / soft. Not the default pipeline (PARTICLE_SHADER_SOURCE stays the 8-float flat quad). Soft fade samples a bound scene-depth texture when hasSceneDepth is set; otherwise saturate(1 − |viewZ| · softness).