完整资源:
前情提要:
从0开始编写minecraft光影包(0)GLSL,坐标系,光影包结构介绍
从零开始编写minecraft光影包(4)泛光性能与品质优化
目录
前言
国庆放假摸鱼好久了。。。今天来更新一下罢
上次讲到实现了更好品质的泛光,可是因为mc的光照系统过于蛋疼,还是存在种种问题。今天来解决其他的问题。
注:这部分的内容基于上一篇博客中【对低分辨率纹理进行模糊】小节的代码
光照系统
光照是着色器面临的重要部分。一个好的光照系统能够让着色器画面更加逼真。在上一篇的着色器中,我们虽然解决了泛光的问题,但是仍然存在很多潜在的问题:
首先是光源方块也会被染上阴影
因为阴影的关系,暗处的方块颜色会非常暗:
而夜间则会显得非常亮,尤其是人造光源的亮度和太阳的亮度相等,这是有违常识的:
所以我们迫切需要改写mc的光照系统。我们将光照简单的分为两种类型:
- 自然环境光,由太阳和月亮提供
- 人造光源照明,由玩家放置的方块提供
发光物体确定后,我们需要明确光照的几条规则:
- 自然环境光的强度远大于人造光源的照明强度
- 夜间的时候,自然环境光的强度应该减少。
- 当自然光和人造光源都存在时,取最大的一方作为最终光照的结果
所以我们需要修改 gbuffers_terrain 着色器,我们需要重新计算光照。
还记得顶点着色器中的光照纹理坐标🐎?
lightMapCoord = gl_TextureMatrix[1] * gl_MultiTexCoord1;
其中 lightMapCoord 的 x 轴表示人造光源的强度,y 轴表示自然光源的强度。如果我们在 gbuffers_terrain 着色器直接输出他们的 x 或 y 坐标,那么会有如下的结果:
blockColor.rgb = vec3(lightMapCoord.x);
or
blockColor.rgb = vec3(lightMapCoord.y);