古剑奇谭吧 关注:814,520贴子:31,946,573

回复:愿我中华游戏,星火世传,奋飞不辍——从技术角度浅谈古剑3

取消只看楼主收藏回复

SSAO的计算阶段其实和SSR差不多,都是在渲染完成后,利用深度图做计算。
通过深度图的深度信息,可以很轻松的判断出场景里哪些位置是大角度的折角。


IP属地:广东41楼2020-02-20 14:40
收起回复
    三、水体

    水的渲染一直都是技术美术们最头疼的事情。因为这玩意怎么做都是没有最好,只有更好。
    而且吧,水的渲染一直都是资源黑洞。
    古剑3里面,水的渲染难点有:
    1. 波浪。水被风吹起来的波浪,这个相当于实时调整模型顶点,以及曲面细分。
    2. 水的折射。
    3. 水的反射。


    IP属地:广东44楼2020-02-20 14:54
    回复
      2026-04-30 00:20:00
      广告
      不感兴趣
      开通SVIP免广告
      这个是莲中境的水面。
      包含了水面波纹、折射、水下部分、水-岸交互等。


      IP属地:广东46楼2020-02-20 14:58
      回复
        水这一块,其实我完全不知道咋做,水太深了
        大概说一下就是:
        水面波纹可以用至少3层的水波函数去叠。最简单的可以是Perlin Noise(做云的),或者是Voronoi(做山脉的),也有可能是其他函数。反正哪个都不好写。加上曲面细分就更难了。
        水体的颜色一般是用一个渐进查找表去做,输入参数是水的深度,输出颜色和透明度。
        折射一般是使用一个单独的RenderPass,在渲染后根据水体表面法线方向进行折射。
        水下部分一般就是加个指数雾。从水面开始向下,雾的浓度呈指数上升。
        当然,要加个优化——离摄像机太远的水底物体,一律剔除掉。
        水与岸的交互这块....emmmm....完全不会


        IP属地:广东48楼2020-02-20 15:07
        回复
          除了水体之外,古剑3还做了雨滴和积水的交互效果。

          雨下的太大了所以不知道雨滴和波纹是否是一一对应的。
          同样,这个雨和地面波纹的牛逼之处就在于——它不是通过粒子系统喷射出来的(那样会特别吃CPU),而是靠显卡算出来的。


          IP属地:广东50楼2020-02-20 15:12
          收起回复
            另外一个****的点就是——在集泷之战,如果把摄像机朝天看,镜头上会沾水。
            这个不稀奇,厉害的是,每个水滴都是有折射的!

            大概就是,每个雨滴都是一个凸透镜,所以要在Post Processing阶段对雨滴专门进行一次后处理,且要在Bloom(光晕/辉光)等操作前面。

            其实这个不是太难写,主要是如何让这玩意能高效运行。因为我个人测试,沾水和不沾水,区别不大。


            IP属地:广东51楼2020-02-20 15:24
            收起回复
              另外说一个我不是很确定烛龙做没做的东西:次表面散射(Subsurface Scattering)。
              次表面散射指的是,当强光穿过某些半透明物体,比如皮肤(不是羽林大哥那种老皮)或者是薄片的玉时,入射到物体中的光会有一部分反射回表面。
              典型的应用就像是...白里透红的皮肤、树叶。
              我没有找到强光直射皮肤的地方,不过我在天鹿城找到了个树叶,不知道是不是用上了次表面散射。


              IP属地:广东56楼2020-02-20 16:01
              收起回复
                在很久很久以前,次表面散射只在电影中出现,因为需要Path Tracing。
                直到某位神人用Mipmap的方式(从统计学意义上)把次表面散射给实时化了。
                https://pdfs.semanticscholar.org/328e/1f1e0751e41f26eedcee684eac2e431ab049.pdf


                IP属地:广东59楼2020-02-20 16:12
                回复
                  2026-04-30 00:14:00
                  广告
                  不感兴趣
                  开通SVIP免广告
                  次表面散射的原理如图:

                  当光线入射皮肤后,主要的部分被反射,形成了少女皮肤的基本颜色,或者是老男人皮肤的全部颜色。
                  对于“吹弹可破”的皮肤而言,一部分光会在角质层、胶原蛋白层这两个半透明的层被反射出去。
                  还有一部分会穿过角质层和胶原蛋白,入射皮下血管。由于血管和肉是红色的,所以反射回去的颜色是红色,这样,才有了“白里透着红”的感觉。


                  IP属地:广东61楼2020-02-20 16:19
                  回复
                    既然光线在皮肤下面其实也是乱飞的,那么我们是否可以用某种噪声来模拟光的乱撞从而实现次表面散射呢?
                    当然是可以的。只不过这又要向我们要一张贴图,太吃资源了。
                    人物贴图一般都是2048甚至4096的,多一张图就意味着多吃几十MB的显存。
                    而实际上,我们可以用Mipmap来代替这个厚度图。
                    众所周知,颜色贴图(AlbedoMap)以及其他贴图都是2的N次方大小。比如512*512,1024*1024,2048*2048,4096*4096。
                    这是为了显卡中方便计算。当某个物体距离我们很远的时候,我们无需给它一个特别高清的贴图。给个256甚至128的就行。
                    Mipmap实际上是,在我们把一张贴图导入到游戏引擎中之后,自动生成的一系列贴图,比如导入一个512*512的贴图,就会生成256*256,128*128,64*64,32*32,16*16,8*8,4*4这几张图。具体案例可以参考dds格式的图。
                    所以我们只需要把几张Mipmap在渲染时依次叠起来,就能大概做出“白里透着红”的感觉了。


                    IP属地:广东62楼2020-02-20 16:25
                    回复
                      我个人不大清楚古剑3里面是不是用了次表面散射,这个功能(对于我这种眼瞎的人来说)除非是用画面对比,否则很难看出来。
                      不过总体来说实现起来难度不大,如果这次没用,可以考虑古剑4时用。次表面散射配合上RTX效果应该能更好~
                      (技术美术会不会打死我


                      IP属地:广东63楼2020-02-20 16:29
                      回复
                        另外,动视的COD里面所使用的PBR渲染管线大概是这样的:
                        https://research.activision.com/publications/archives/practical-multilayered-materials-in-call-of-dutyinfinite-warfare
                        我估计无论是吹COD画面的还是踩COD的,绝大多数都没了解过如何去量化的评价游戏画质


                        IP属地:广东65楼2020-02-20 16:36
                        回复
                          嗯,又翻了一遍剧情,图形学方面应该是没有啥遗漏的东西了。
                          总结下就是,古剑3在画面/图形学方面来说,和同期全球3A级游戏相比(2018年),基本是持平的,甚至某些部分做的非常好。
                          尤其是考虑到烛龙整个的程序员团队规模,甚至比不上EA、育碧、暴雪等大厂的一个图形研发部门。
                          可以说,古剑3的画面,是在力所能及的范围内,使用着一个远古引擎东拼西凑负重前行的情况下,人力所能达到的极致。


                          IP属地:广东72楼2020-02-20 18:04
                          收起回复
                            另外说一下物理引擎这一块。
                            首先,把一个外部的物理引擎移植到自己开发的游戏引擎内部,是非常困难的。
                            比如Unity,到现在也仅仅是“部分”移植了PhysX的功能,还是单线程的,N卡的PPU的部分则完全没有移植。
                            这大概也就是为什么烛龙人手这么紧缺的情况下,要用四个人去做物理引擎部分。
                            物理引擎的效果呢,实际上还是很不错的。
                            其实很多第三人称游戏都取消了跳跃。主要是允许玩家蹦蹦跳跳非常容易出bug,比如蹦到房屋内,比如原地升天,比如卡墙之类的。
                            但是烛龙还是非常勇敢的允许了玩家跳跃的功能,这背后要加多少工作量,可能只有他们自己知道


                            IP属地:广东75楼2020-02-20 18:20
                            收起回复
                              2026-04-30 00:08:00
                              广告
                              不感兴趣
                              开通SVIP免广告
                              古剑3唯一一个做的可能不是太好的地方就是布料解算这一块。
                              布料解算这块主要影响的是头发和衣服
                              具体不清楚烛龙用的是什么方法,目测应该大概好像是...基于位置的(position based)布料模拟。
                              不过这个好像做的不是特别好,因为一旦缩放人物,头发就会颤动一下,有时候过场动画时头发也有小概率会抖动。
                              但是在单纯的旋转人物后,头发却能很快的收敛到安定态,所以应该不是阻尼的问题。
                              个人感觉是....头发的position based中的坐标,应该用头发父级物体的Transform,或者是世界坐标系,而不是摄像机的坐标。


                              IP属地:广东78楼2020-02-20 18:44
                              收起回复