mc光影吧 关注:8,587贴子:130,337
  • 20回复贴,共1

[教程]SEUS Release版全系(除PTGI)水面不反射天空的解决方案

只看楼主收藏回复

最近@阿萨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系列,我会找个时间在此帖继续更新。
最后的最后,记得开“只看楼主”模式


IP属地:中国香港1楼2019-04-26 18:05回复
    只看楼上↑


    IP属地:重庆来自手机贴吧2楼2019-04-26 18:25
    回复
      。。。其实John大佬已经发过10.1-11.0的


      IP属地:广东3楼2019-04-26 18:52
      收起回复
        谢谢大佬!!!!!!!!!!!!!!!!!!
        顶顶顶!!!!!!!!!!!!!!


        4楼2019-04-26 19:10
        回复
          SEUS Renewed全系水面修复方案计划会在五一更新,敬请关注


          IP属地:中国香港5楼2019-04-26 22:23
          回复
            不错,支持卫星


            IP属地:广东来自Android客户端6楼2019-04-26 23:47
            回复
              说起SEUS Renewed系列,就有一个有趣的事情。SEUS Renewed系列的主要改进在于将底层的材质判断和通道分配重写了一遍,而其它代码基本没有什么改变。有趣的地方在于,同样的东西,换个形式,很多人就不知所措了。为了保证你们并不是只是在接下来的讲解中简单的复制粘贴,我会略讲与前面SEUS V11.0中一样的内容,并留下一些东西给你们思考。
              首先,SEUS Renewed系列的屏幕空间反射从composite2.fsh移到了composite3.fsh,原因是为了解决焦散撕裂的问题Cody专门写了composite1来修复这个问题,因为和本次教程主题无关,具体我就不细讲,了解就可以了,如果有兴趣也可以自己去研究一下。
              那么我们打开composite3.fsh,同样是找到ComputeRaytraceReflection函数,往下拉找到:

              仍是同样的操作,具体我不再重复细讲。因为SEUS Renewed系列只加了反射点的距离判断而没有加天空判断,所以只需要把距离判断注释掉就行了。
              备注:其实SEUS Renewed系列没有了天空的判断也算是一种优化,因为在前面反射点的距离判断时已经将天空排除掉了,所以后面如果再进行天空的判断就是在做无用功。
              此时将文件保存好,此时你便可以mc测试一下。这里我会提供一对对比图(上为修改前,下为修改后):


              于是不能反射天空的问题就这样解决了,这个方法适用于除PTGI和LPVGI以外的任何SEUS Renewed系列版本,原理与SEUS V10.0-11.0的修改方法是一样的。不过本教程不会提供任何“在第几行添加什么东西”,具体情况还是需要你自己灵活处理,如有什么问题可以向我提问。


              IP属地:中国香港7楼2019-04-27 18:00
              收起回复
                讲个事,seus10代和renewed的水老是在远处有一条黑线,很难看,但是把渲染精度调高一点就会好点


                只有11没问题


                IP属地:江苏8楼2019-04-27 19:25
                收起回复
                  通过此贴,再实践了下,我看出了lz不适合写教程,没错


                  IP属地:广东9楼2019-09-21 13:25
                  回复
                    lz教的是思维方式啊(#滑稽)


                    IP属地:江苏来自iPhone客户端10楼2020-01-29 14:05
                    回复
                      se爷子这弄的确实傻不拉几的,hypercol的天空反射应该没问题


                      11楼2020-02-06 15:42
                      回复