mojira.dev
MC-43968

Smooth lighting no longer works properly in certain block configurations

NOTE: the following fix pertains to 1.7, an updated version will be needed for 1.16+

Let me first off say that I know this is a duplicate, but I have code-fixes for it.

As you can see in the 2 images, the first one (The bugged version), has inconsistent lighting travelling from one block to the next, the corners don't match up. This is primarily noticeable in 1 wide staircases underground, and for good reason.

Basically what is happening is that the render code is checking the transparency of blocks with an incorrect offset. When you get your coordinates wrong you're bound to get some weird results.

This code is drawing the bottom face.

if (this.renderMinY <= 0.0D)
{
     --y;
}

this.aoBrightnessXYNN = par1Block.getMixedBrightnessForBlock(this.blockAccess, x - 1, y, z);
this.aoBrightnessYZNN = par1Block.getMixedBrightnessForBlock(this.blockAccess, x, y, z - 1);
this.aoBrightnessYZNP = par1Block.getMixedBrightnessForBlock(this.blockAccess, x, y, z + 1);
this.aoBrightnessXYPN = par1Block.getMixedBrightnessForBlock(this.blockAccess, x + 1, y, z);
this.aoLightValueScratchXYNN = par1Block.getAmbientOcclusionLightValue(this.blockAccess, x - 1, y, z);
this.aoLightValueScratchYZNN = par1Block.getAmbientOcclusionLightValue(this.blockAccess, x, y, z - 1);
this.aoLightValueScratchYZNP = par1Block.getAmbientOcclusionLightValue(this.blockAccess, x, y, z + 1);
this.aoLightValueScratchXYPN = par1Block.getAmbientOcclusionLightValue(this.blockAccess, x + 1, y, z);
transparencyXYPN = Block.canBlockGrass[this.blockAccess.getBlockId(x + 1, y - 1, z)];
transparencyXYNN = Block.canBlockGrass[this.blockAccess.getBlockId(x - 1, y - 1, z)];
transparencyYZNP = Block.canBlockGrass[this.blockAccess.getBlockId(x, y - 1, z + 1)];
transparencyYZNN = Block.canBlockGrass[this.blockAccess.getBlockId(x, y - 1, z - 1)];

if (!transparencyYZNN && !transparencyXYNN)
{
     this.aoLightValueScratchXYZNNN = this.aoLightValueScratchXYNN;
     this.aoBrightnessXYZNNN = this.aoBrightnessXYNN;
}
else
{
     this.aoLightValueScratchXYZNNN = par1Block.getAmbientOcclusionLightValue(this.blockAccess, x - 1, y, z - 1);
     this.aoBrightnessXYZNNN = par1Block.getMixedBrightnessForBlock(this.blockAccess, x - 1, y, z - 1);
}

What it does is decrements the y value to save a bunch of subtractions since the whole next section uses "y - 1". It appears as if in the case of every face, a part was left as "y - 1" (Or any other respective coordinate changes such as "y + 1", "x - 1", "x + 1", "z - 1", "z + 1").

transparencyXYPN = Block.canBlockGrass[this.blockAccess.getBlockId(x + 1, y - 1, z)];
transparencyXYNN = Block.canBlockGrass[this.blockAccess.getBlockId(x - 1, y - 1, z)];
transparencyYZNP = Block.canBlockGrass[this.blockAccess.getBlockId(x, y - 1, z + 1)];
transparencyYZNN = Block.canBlockGrass[this.blockAccess.getBlockId(x, y - 1, z - 1)];

The way I was able to fix this was by adding 3 ints at the top of the method called xConst, yConst, zConst (or more appropriate names), set those to the coordinates passed into the function and changed the code to

transparencyXYPN = Block.canBlockGrass[this.blockAccess.getBlockId(x + 1, yConst - 1, z)];
transparencyXYNN = Block.canBlockGrass[this.blockAccess.getBlockId(x - 1, yConst - 1, z)];
transparencyYZNP = Block.canBlockGrass[this.blockAccess.getBlockId(x, yConst - 1, z + 1)];
transparencyYZNN = Block.canBlockGrass[this.blockAccess.getBlockId(x, yConst - 1, z - 1)];

This bug is both aesthetically unpleasing, but also causes the "Lava light leaking through corners" bug.

Also, while I was looking through the rendering code, I found the source of the upside-down half-slab lighting bug. A half-slab gets lit using the highest of the neighbour's light values, but it doesn't check the light value of the block below.

topBrightness = this.getSpecialBlockBrightness(par1EnumSkyBlock, par2, par3 + 1, par4);
eastBrightness = this.getSpecialBlockBrightness(par1EnumSkyBlock, par2 + 1, par3, par4);
int westBrightness = this.getSpecialBlockBrightness(par1EnumSkyBlock, par2 - 1, par3, par4);
int northBrightness = this.getSpecialBlockBrightness(par1EnumSkyBlock, par2, par3, par4 + 1);
int southBrightness = this.getSpecialBlockBrightness(par1EnumSkyBlock, par2, par3, par4 - 1);

if (eastBrightness > topBrightness)
{
	topBrightness = eastBrightness;
}

if (westBrightness > topBrightness)
{
	topBrightness = westBrightness;
}

if (northBrightness > topBrightness)
{
	topBrightness = northBrightness;
}

if (southBrightness > topBrightness)
{
	topBrightness = southBrightness;
}

return topBrightness;

The first idea that comes to mind is to push this code into the Block class so that it can be overloaded in child classes such as slabs.

Linked issues

Attachments

Comments 23

This is still a concern in 1.8.1-pre3. Old bug, but still present. I recently made a report about a different issue with ambient occlusion... Best fix is to start from scratch.

Still a concern in 1.8.2.

Still a concern in 1.8.4. Added a screenshot showing a much more noticeable example.

[media]

[media]


Confirmed for 17w47b

13 more comments

The latest snapshot has made changes to smooth lighting that make this less apparent, but the bug is still there in some capacity. Should this be resolved as fixed and a ticket on the new behaviour be made?

[media]

Can confirm in 1.17.1.

It appears this issue and MC-12558 were caused by the optimizations done to smooth lighting in the experimental snapshot 13w12~, which can be still dowloaded from this bug report: https://bugs.mojang.com/browse/MC-8824?focusedCommentId=55414#comment-55414

This is how a staircase structure appeared before the optimization fixes:

[media]

And this is how it appeared after, and still continues to appear in modern versions:

[media]

I would like to confirm for 25w46a (where there is still at least one smooth lighting on blocks issue) but I don’t know the difference between this ticket and MC-148689. Given the directionality observed, it seems like MC-138211 is also connected. I don’t if it’s impossible to show this issue separately or if I just lack the understanding.

Below are view of 1x5x5 spaces with a torch, shown from all six directions.

2025-11-12_15.45.10.png
2025-11-12_16.04.34.png
2025-11-12_16.03.03.png
2025-11-12_16.06.19.png
2025-11-12_16.58.48.png
2025-11-12_17.04.38.png

Here is the downwards view again but with a two block space, as a reference.

2025-11-12_17.13.32.png

Jonathan Sells

muzikbike

(Unassigned)

Confirmed

Platform

Normal

Lighting, Rendering

rendering, smooth-lighting, smooth-lighting-interpolation-incorrect, smooth-lighting-not-smooth

Minecraft 1.7.4, Minecraft 1.8.1-pre3, Minecraft 1.8.2, Minecraft 1.8.4, Minecraft 15w42a, ..., 1.18.1, 22w05a, 22w16b, 23w44a, 1.21.5

Retrieved