前言 Introduction |
本文翻译自一个blog,博主总结了很多Minecraftforge模组制作相关的概念,非常简洁扼要。这篇有关光照的文章解决了我许多疑惑,在此翻译并分享给各位。 由于我是java菜鸟,对渲染这一块一窍不通,无法保证翻译完全准确,也无法保证原文的内容100%准确,希望各位能采各家之长,不可偏信,如有谬误,还请批评指正。 ![]() |
正文 Main body |
光照简述 [1.14.4+] Minecraft使用了三种不同的光照模型:
物品光照(Item Lighting) 物品光照使用两个光源来使物品看上去是三维的。当使用适当的渲染类型进行渲染时,它使用顶点法线信息执行着色。 世界光照(World Lighting) Minecraft中最基础的世界光照模型由两部分组成;天空光照和方块光照。世界中的每个格子都有一个介于0 - 15之间的天空光照值和介于0 - 15之间的方块光照值。
原版为每个方块计算天空光照和方块光照。基本概念是:
方块被渲染时,方块光照和天空光照等级被用于设置方块的亮度。步骤如下:
为什么Minecraft要这么做呢?至少有两条很好的理由:
基于面的光照效果(Face-dependent lighting effects) 除了上述的每个方块的照明,Minecraft还可以为方块的每个面进行一些额外的计算,来增强照明的真实性: 1-不同朝向的面的亮度(Direction-dependent face brightness)这个方法根据面的朝向,用不同的光照强度渲染六个面:
这种照明被用于每个面;当材质被渲染时,在原材质上乘一个 "colour" 值(在这个情况下,这个值是不同程度的灰色) 在一些情况下,调用者还会传入一个RGB颜色乘数,(例如在水下,方块被给予了一个蓝**调(tint)),乘以上述的%强度。 面的光照还会受到[方块光照,天空光照]混合亮度的影响。下面的图标总结了这些步骤。
2- 环境光遮蔽(Ambient Occlusion) 环境光遮蔽是一种基于附近的方块计算表面的光照的方法。这儿有Minecraft如何实现这个方法的简介。简而言之,对于每个顶点,计算出三个毗邻的方块和接触这个面的方块的平均光照强度。在下方的例子中,对于这个用红色圈起来的顶点,是以白色显示的这三个方块和这个面正上方的方块(未显示)的平均亮度。如果这四个方块都是透明的,”环境光遮蔽“光照强度将会是1.0。每个不透明方块都会降低顶点接收到的光照 - 如果四个方块都是不透明的那么这个强度将会是0.2。”环境光遮蔽“值会与顶点的颜色乘数相乘。顶点的混合亮度被计算为四个相邻方块的平均值。(还有一些其他有关对角方块是否被计算在内的细节,但是你已经知道了基本的思路)在绘制面时,OpenGL提供了平滑,所以环境光遮蔽在不同顶点上的产生的阴影在整个平面上被平滑了。
更多细节: 当一个四边形在世界中被渲染时,可能被应用一些不同的光照效果:
方块光照+天空光照按照四边形所处的位置计算:
方块光照+天空光照通常计算为:
一些有趣的原版类 BlockModelRenderer::renderModelSmooth (ambient occlusion rendering) BlockModelRenderer::renderModelFlat (no ambient occlusion) ILightReader LightTexture (the multitexture used for blocklight+skylight) WorldRenderer::getPackedLightmapCoords 更多信息 |