最近@阿萨332sb 问了我有关水不反射天空的问题,到才注意到网上对于这种情况至今没有一个较好的修复方案。我注意到较早以前的国内的修复方案居然是把seus 10.0的代码复制粘贴到新版,连continuum系列光影也是这么干,有点陶醉
因此在这里我不打算这样告诉你们如何把seus10的反射移植到任意版本,毕竟老的东西有它的缺陷所在。那么切入正题,我先来简单讲讲为什么其它的光影都能反射天空,而SEUS光影就是不行
首先先撇开原理,以SEUS V11.0为例,我们来看一下在compsite2.fsh的屏幕空间反射代码(屏幕大小有限所以我只能删掉注释和空行,将就一下吧):
图中高亮的判断语句,用于判断是否为天空,是则不输出反射。
至于其中是怎么判断的我不细讲,因为SEUS Renewed以前所有版本的材质判断比较混乱,而且这个不属于这次我要讲的范畴,具体可以自己去翻看代码了解。
那么接下来请做一下猜测,color.a = 0.0f;的作用是什么?为什么能控制画面的结果?
可以注意到color作为函数返回值,那么color.a可能是控制画面的透明度?为了验证这个猜想,我们顺藤摸瓜,利用函数名往下查找。
通过标注出来的行,可以看出reflection.a其实就等于color.a,我们注意到reflection.a在标注出来的行中控制着反射的强度,那么就验证了前面的猜想。那么多出来的ComputeFakeSkyReflection函数又是什么呢?顾名思义我们可以知道这个是在水面上投射一个“天空”,前面我们已经知道当反射点为天空时,反射强度为0,那么这个投射出的“天空”相应的就是补上空缺的部分。
讲到这里,我想你们应该都知道接下来就是把不需要的代码注释掉(标注出来的为新增内容):
这里你是不是迫不及待的就想保存然后在mc上查看结果?在此之前,首先我们先找到ComputeFakeSkyReflection函数,将下图语句注释掉,以避免干扰我们的对比:
不过此时你打开mc进行测试,只会失望地发现,水面并没有反射天空,具体可以自己进行尝试。试想一下问题出在哪里呢?如果你的思维足够灵敏,那么此时你应该马上就想到问题可能出在反射本身!如果你此时往上检查代码,那么就会看到下图标注的代码:
这个判断简单来说就是判断反射点是否为接近无限远,如果是,那么就会跳过后面的循环。能接近无限远的物体,也就只有天空了吧!于是我们只要再次使用注释大法将其注释掉:
当这些操作完成了以后,此时打开mc进行测试便可以达到你想要的效果了,比如下面的对比图(上为修改前,下为修改后):
最后,我们再回到前面注释掉的投射“云”,将其还原成代码:
这个就是SEUS V11.0的处理方法,适用于SEUS V10.0-10.2,但不适用于SEUS Renewed系列,我会找个时间在此帖继续更新。
最后的最后,记得开“只看楼主”模式
因此在这里我不打算这样告诉你们如何把seus10的反射移植到任意版本,毕竟老的东西有它的缺陷所在。那么切入正题,我先来简单讲讲为什么其它的光影都能反射天空,而SEUS光影就是不行
首先先撇开原理,以SEUS V11.0为例,我们来看一下在compsite2.fsh的屏幕空间反射代码(屏幕大小有限所以我只能删掉注释和空行,将就一下吧):
图中高亮的判断语句,用于判断是否为天空,是则不输出反射。
至于其中是怎么判断的我不细讲,因为SEUS Renewed以前所有版本的材质判断比较混乱,而且这个不属于这次我要讲的范畴,具体可以自己去翻看代码了解。
那么接下来请做一下猜测,color.a = 0.0f;的作用是什么?为什么能控制画面的结果?
可以注意到color作为函数返回值,那么color.a可能是控制画面的透明度?为了验证这个猜想,我们顺藤摸瓜,利用函数名往下查找。
通过标注出来的行,可以看出reflection.a其实就等于color.a,我们注意到reflection.a在标注出来的行中控制着反射的强度,那么就验证了前面的猜想。那么多出来的ComputeFakeSkyReflection函数又是什么呢?顾名思义我们可以知道这个是在水面上投射一个“天空”,前面我们已经知道当反射点为天空时,反射强度为0,那么这个投射出的“天空”相应的就是补上空缺的部分。
讲到这里,我想你们应该都知道接下来就是把不需要的代码注释掉(标注出来的为新增内容):
这里你是不是迫不及待的就想保存然后在mc上查看结果?在此之前,首先我们先找到ComputeFakeSkyReflection函数,将下图语句注释掉,以避免干扰我们的对比:
不过此时你打开mc进行测试,只会失望地发现,水面并没有反射天空,具体可以自己进行尝试。试想一下问题出在哪里呢?如果你的思维足够灵敏,那么此时你应该马上就想到问题可能出在反射本身!如果你此时往上检查代码,那么就会看到下图标注的代码:
这个判断简单来说就是判断反射点是否为接近无限远,如果是,那么就会跳过后面的循环。能接近无限远的物体,也就只有天空了吧!于是我们只要再次使用注释大法将其注释掉:
当这些操作完成了以后,此时打开mc进行测试便可以达到你想要的效果了,比如下面的对比图(上为修改前,下为修改后):
最后,我们再回到前面注释掉的投射“云”,将其还原成代码:
这个就是SEUS V11.0的处理方法,适用于SEUS V10.0-10.2,但不适用于SEUS Renewed系列,我会找个时间在此帖继续更新。
最后的最后,记得开“只看楼主”模式