完整资源:
前情提要:
从0开始编写minecraft光影包(0)GLSL,坐标系,光影包结构介绍
从零开始编写minecraft光影包(4)泛光性能与品质优化
从零开始编写minecraft光影包(5)简单光照系统,曝光调节,色调映射与饱和度
前言
在国庆又当懒狗了几天之后,终于决定又来更新博客了。。。。
今天更新天空的绘制,我们将绘制自定义的天空颜色以及太阳,月亮,雾,以及他们的昼夜交替效果。
注:本章节博客基于 上一篇博客 中完成的光影包代码
干掉原版天空
要绘制我们自定义的天空,首先我们需要干掉原版的天空,通过查阅资料可知,有两个着色器负责天空的绘制:
- gbuffers_skybasic :天空原色 + 星星
- gbuffers_skytextured : 太阳与月亮
那么我们需要干掉原版的天空,让这两个着色器输出纯黑即可。我们编写四个着色器,分别是:
gbuffers_skybasic.fsh,gbuffers_skybasic.vsh,gbuffers_skytextured.fsh,gbuffers_skytextured.vsh
其中 .vsh 的内容都是:
#version 120
void main() {
gl_Position = ftransform();
}
与之对应,.fsh 的内容为:
#version 120
void main() {
gl_FragData[0] = vec4(vec3(0), 1.0);
}
再次加载光影包,我们发现原版的天空已经被我们干掉了,太阳,月亮以及其他天空颜色都消失了。。。现在可以开始着手绘制我们的天空了
天空基色绘制
因为没有一个很好的机制来判断何处是天空,我们采用曲线救国的方式,通过距离计算原色与天空颜色混合(即mix线性混合)。
即:越远的方块,颜色越靠近天空的颜色,这样绘制最终会形成雾的效果。这样会比直接使用距离作为阈值来绘制天空要平滑很多。
要绘制天空颜色,首先我们需要有昼夜变换的的天空颜色,我们在 composite.vsh 中加入:
uniform int worldTime;
varying vec3 mySkyColor;
vec3 skyColorArr[24] = {
vec3(0.1, 0.6, 0.9), // 0-1000
vec3(0.1, 0.6, 0.9), // 1000 - 2000
vec3(0.1, 0.6, 0.9), // 2000 - 3000
vec3(0.1, 0.6, 0.9), // 3000 - 4000