diff --git a/src/renderer/webgl/shaders/TilemapGPULayer-frag.js b/src/renderer/webgl/shaders/TilemapGPULayer-frag.js index 862dfd8564..b592df4504 100644 --- a/src/renderer/webgl/shaders/TilemapGPULayer-frag.js +++ b/src/renderer/webgl/shaders/TilemapGPULayer-frag.js @@ -227,6 +227,10 @@ module.exports = [ '{', ' vec2 layerTexCoord = outTexCoord;', ' Tile tile = getLayerData(layerTexCoord);', + ' if (tile.empty)', + ' {', + ' discard;', + ' }', ' Samples samples = getFinalSamples(tile, layerTexCoord);', ' vec4 fragColor = samples.color;', ' #pragma phaserTemplate(declareSamples)', diff --git a/src/renderer/webgl/shaders/src/TilemapGPULayer.frag b/src/renderer/webgl/shaders/src/TilemapGPULayer.frag index 8430963a03..4c256c39f5 100644 --- a/src/renderer/webgl/shaders/src/TilemapGPULayer.frag +++ b/src/renderer/webgl/shaders/src/TilemapGPULayer.frag @@ -301,6 +301,15 @@ void main () vec2 layerTexCoord = outTexCoord; Tile tile = getLayerData(layerTexCoord); + // Empty cells must not draw anything. Without this, empty tiles sample the + // tileset at (0, 0) - the top-left texel of tile 0 - which is opaque for + // most tilesets, painting tile 0 over everything drawn beneath the layer + // (and causing stacked GPU layers to hide one another). + if (tile.empty) + { + discard; + } + Samples samples = getFinalSamples(tile, layerTexCoord); vec4 fragColor = samples.color;