完整资源:
前情提要:
从0开始编写minecraft光影包(0)GLSL,坐标系,光影包结构介绍
目录
前言
今天没啥课了 ,继续填坑
上回提到基础阴影的种种问题,比如:
比如分辨率堪忧,阴影的细节不够还原
或者是阴影的误判:
阴影绘制误判解决方案
通过观察发现,误判的情况往往发生在光线平行于方块表面时:
而且mc默认的太阳,运行轨迹永远是在正上方的:
正上方的太阳有一个问题,就是无论何时,太阳光方向,都能和所以方块的侧面平行:
这个问题有一个简单的解决方案,那就是修改太阳的偏移角度,而 shadermod 中设置了一个可控变量来描述
所谓可控变量,就是通过设置这些变量,来修改一些默认的光影设置。比如太阳的运行轨迹,就是shadermod默认生成的,但是可以通过改变可控变量,进行修改。
通过可控变量修改太阳运行轨迹的方法很简单,在顶点着色器(任意一个)中加入:
const float sunPathRotation = -40.0;
即可修改太阳的偏移角度(0就是mc的默认值):
修改之后,太阳会按照偏移的较度运行,入射光和方块表明平行的情况相对较少了。。。 但是注意,修改太阳偏移角之后,一天中总有某个时间段,太阳入射光平行于方块表明,但是这个时间段短到可以接受
好吧其实我是懒狗,加一个法线判断一下就好了,关于法线打算留到水面反射的绘制再进行讲解,那时候再补上吧。。咕了
可以看到,入射光和方块表明平行的情况少了,但是任然存在阴影分辨率不足的问题:
提高shadow纹理的分辨率
上一篇博客讲到阴影的绘制,离不开shadow纹理,所以shadow纹理的精细度,决定了阴影的质量。和太阳偏移角一样,我们可以通过设置可控变量来实现修改:
在任意顶点着色器中加入:
const int shadowMapResolution = 4096;
其中shadow纹理默认的分辨率是1024,我们将其变为原来的4倍:
可以看到效果还是十分有效的,因为精度提高,误判减少了,而且阴影分辨率变高了:
但是,这一切值得吗
因为shadow纹理是shadermod预先绘制的,那么提高分辨率,性能就会下降,会掉帧。。。
所以,单纯提升shadow纹理的分辨率,不是一个好的方法,那么有没有什么方法,能够不改变纹理分辨