From 4ca3f4df2f42bf5c69a72ebeeb9c5f4a97b03862 Mon Sep 17 00:00:00 2001 From: RDW Date: Tue, 13 Feb 2024 10:08:23 +0100 Subject: [PATCH 1/2] Client: Fix an unintended conversion in the terrain shader This error was concealed by a recent change to wgpu, where it would automatically convert unsigned integers to floats when it deems it "safe" to do so. Previously, it would've given a validation error here because the hardcoded numbers aren't compiled to floats unless explicitly marked as such. Apparently, this hidden conversion broke the discard logic, leading to black surfaces being discarded in at least one case (c_tower1). This is because the division doesn't have enough precision if using integers. Being explicit fixes the problem. --- Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl b/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl index 20f289b8..52a4fc42 100644 --- a/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl +++ b/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl @@ -137,7 +137,7 @@ fn vs_main(in: VertexInput) -> VertexOutput { // Magenta background pixels should be discarded (but pre-processing on the CPU is expensive) fn isTransparentBackgroundPixel(diffuseTextureColor : vec4f) -> bool { - return (diffuseTextureColor.r >= 254/255 && diffuseTextureColor.g <= 3/255 && diffuseTextureColor.b >= 254/255); + return (diffuseTextureColor.r >= 254.0/255.0 && diffuseTextureColor.g <= 3.0/255.0 && diffuseTextureColor.b >= 254.0/255.0); } @fragment From b7e9b925acb75bb1cd220a0abcb8b698269649db Mon Sep 17 00:00:00 2001 From: RDW Date: Tue, 13 Feb 2024 10:10:33 +0100 Subject: [PATCH 2/2] Perf: Ensure transparent terrain fragments are discarded Setting the alpha to zero has the same net effect, but it wastes GPU compute time as the rest of the shader program might still be executed - for no good reason, given that the fragment won't be visible anyway. --- Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl b/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl index 52a4fc42..49d32475 100644 --- a/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl +++ b/Core/NativeClient/WebGPU/Shaders/TerrainGeometryShader.wgsl @@ -149,7 +149,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4f { let ambientColor = uPerSceneData.ambientLight.rgb; if (isTransparentBackgroundPixel(diffuseTextureColor)) { - diffuseTextureColor.a = 0.0; + discard; } let lightmapTexCoords = in.lightmapTextureCoords;