src/scene/renderer/shadow-map.js:91:
filter = device.extTextureFloatLinear ? FILTER_LINEAR : FILTER_NEAREST;
extTextureFloatLinear is a raw WebGL extension object, set only by the WebGL backend (webgl-graphics-device.js:912) — it is undefined on WebGPU and Null devices. The portable flag for this capability is device.textureFloatFilterable, which is exactly what light.js:503 uses to approve SHADOW_VSM_32F in the first place (and which WebGPU sets from the float32-filterable feature).
Result: on WebGPU, VSM32 shadows are approved by the light but silently sampled with nearest filtering. Line 91 should test device.textureFloatFilterable.
🤖 Found during a code audit with Claude Code
src/scene/renderer/shadow-map.js:91:
extTextureFloatLinearis a raw WebGL extension object, set only by the WebGL backend (webgl-graphics-device.js:912) — it is undefined on WebGPU and Null devices. The portable flag for this capability isdevice.textureFloatFilterable, which is exactly what light.js:503 uses to approveSHADOW_VSM_32Fin the first place (and which WebGPU sets from thefloat32-filterablefeature).Result: on WebGPU, VSM32 shadows are approved by the light but silently sampled with nearest filtering. Line 91 should test
device.textureFloatFilterable.🤖 Found during a code audit with Claude Code