古剑奇谭吧 关注:814,689贴子:31,946,315

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

取消只看楼主收藏回复


Steam上33入的,经历了大概60多个小时,总算是打通了一周目。可以说是感慨颇多,古剑3也确实配得上是国产游戏天花板的荣誉了,甚至放眼世界也不差。
当然也会有很多人拿着老牌大公司的3A游戏来和古剑3比。人嘛,总是要刷刷优越感的。那么......我们应该怎么怼回去呢?
像是剧情、音乐、玩法、构图等众口难调的就不说了,因为每个人都有自己的审美,虽然我都很喜欢就是了。
烛龙能做的是在符合大多数人的审美的基础上,表达自己的审美。
我自己是从事图形学和算法研发方面的工作的,所以我打算从技术的角度来说说烛龙在古剑3上所花费的心血。


IP属地:广东1楼2020-02-20 10:53回复
    首先是引擎方面。
    游戏开始界面上,打开游戏信息,拉到下面可以看到:

    这些里面有我用过的,也有一部分没用过的
    但是,我没在这里面找到游戏引擎
    其实,当初打开游戏的时候就觉得这个像是Unreal的渲染风格。然后我去安装目录看了一眼.....
    发现这个文件名和文件夹根本就不对呀...
    而且也不是Unity的,也不是StingRay的,也不是Optix的。
    之后我才意识到....烛龙应该是自己写的游戏引擎,然后在此基础上开发的古剑3
    这个是真的勇士,也是最让我惊讶的。
    现在是2020年,做一个游戏的成本已经远远低于2010年那个时代了。
    随便下个UE4或者Unity,在素材库里面买几个素材,写点代码或者从github上抄点,随便拼拼就行。
    然而在这个年代,还有人愿意一步一步的从底层开发,这才是真的负重前行。
    然后说一下上面这几家都提供了什么:
    PopcornFX:看见FX就知道是特效。这家是提供粒子系统的。
    Havok:物理引擎。头发、布料的解算。碰撞、打击判定等。
    Nvidia:除了造显卡之外还有很多软件。太多了所以我不知道他们到底用了啥。可能是PhysX,可能是cg。
    Oodle:不知道...
    SpeedTree:游戏里的树、灌木等等。Procedural Modeling的软件,专门造植物,还能优化模型。
    YEBIS:特效
    FMOD:音效
    BINK:播视频的


    IP属地:广东2楼2020-02-20 11:18
    收起回复
      2026-06-01 22:59:07
      广告
      不感兴趣
      开通SVIP免广告
      噗....好像还真是用的VE....这***尴尬了
      好吧,那后面就先简单谈谈古剑3实现了哪些功能....
      顺便容我查查VE


      IP属地:广东5楼2020-02-20 11:44
      回复
        一、体积光(Volumetric Light)

        体积光的应用就是当强光(比如太阳光)穿过水汽时,出现的折射现象,让人感觉好像阳光有了体积感。
        最明显的是在树下。比如:


        IP属地:广东7楼2020-02-20 11:52
        收起回复
          像阳光穿过树叶、建筑边缘、云层出现的“体积光”,也就是传说中的“GodRay”,其实有两种实现方法。
          1. 简单粗暴的:在会出现GodRay的位置加个片,在片上画出GodRay。
          比如一些老游戏,或者是不专业的人做的东西,例如LG的LG Simulator。
          这种方法最大的问题是,体积光一定是静态的,不会随着树叶摇摆而改变。
          同时,当阳光角度变化时,GodRay无法变化,或者变化的很难看。
          2. 基于物理的:对光线在空气中的传播进行步长采样(Ray Marching),计算体积光。
          这种方法的好处是能够实时绘制动态体积光,不受阳光角度变化及树叶变化的影响。
          古剑3就是采用的这个方法。具体可以到某个树下去看看~当树叶摇摆时,体积光会随之变化。
          具体可以参考这篇:
          Volumetric fog: Unified, compute shader based solution to atmospheric scattering, ACM Siggraph 2014
          可以从作者的主页上下载
          https://bartwronski.com/publications/


          IP属地:广东9楼2020-02-20 12:13
          回复
            二、SSR(Screen Space Reflection 屏幕空间反射,不是抽卡!)

            SSR用来展现近距离不规则物体表面上的倒影。是一种较为廉价的倒影表现方式(相比于用摄像机来说)。
            比如远处的火焰在地面上的倒影。那个倒影是会随着火焰变化而变化的。

            比如王北洛在天鹿城金属地面附近时,金属上倒映出的腿和皮裤


            IP属地:广东12楼2020-02-20 12:23
            收起回复
              SSR是业界老生常谈的问题了。几乎所有追求画面的次世代游戏都要追求一下SSR。
              在渲染结束后,画面输送到显示屏之前,我们得到的是一张原始图片,以及深度图。
              这张原始图片还没有经过任何的后处理,看起来非常糟糕(全是锯齿,没有任何特效,啥都没有)
              在后效(Post-Processing)阶段,可以增加SSR来制造出“不太真实的”反射。
              因为我们在计算反射时不是在3D空间内计算的,而是完全依赖那张深度图,相当于是在二维空间中算的。因此才叫“屏幕空间反射”。
              SSR的优点是快速,而且可以在非屏幕的物体上展现出反射。
              缺点也很明显:
              1. 如果一个物体在我们的画面上没出现,那么一定不会在倒影里出现。
              2. 因为我们使用的深度图实际上是渲染时用于做z-test所产生的z-buffer(貌似是),因此如果一个物体是半透明的,或者带有透明通道,那么SSR会高几率出BUG(对没错,说的就是你,Unity HDRP)。
              所以为啥需要SSR?
              我们需要反射来表现物体的反光度。但凡擦的特别亮的东西都会反光,对吧。
              有两种东西能表现出物体的反光度:光和倒影。
              某些材质,比如被雨水淋湿的石头还有亮亮的金属,不可能全程处于摄像机与太阳之间。
              所以这时候就需要用反射来表现材质了。


              IP属地:广东13楼2020-02-20 12:38
              回复
                SSR实现方法的那个论文我好像....找不到了
                不过相比其他游戏,在SSR的处理方面,烛龙已经做的非常好了。
                为数不多的BUG出在了眉毛上。具体忘了是哪个过场动画了....反正眉毛是花的。
                当然,这个BUG大家都有。
                原因很简单,眉毛实际上是一个片,上面贴了个透明贴图。
                比如小缨子的浮空眉

                然而在做zTest的时候,是在Raster阶段的,因此出来的深度图里面,眉毛的透明部分也是实心的。
                这样,在算SSR时,眉毛肯定就是错误的。同理,这类错误还会出现在树叶、灌木等带透明通道的物体上。
                只不过烛龙忘了把眉毛剔除出SSR的范围了。


                IP属地:广东16楼2020-02-20 13:32
                收起回复
                  2026-06-01 22:53:07
                  广告
                  不感兴趣
                  开通SVIP免广告
                  说完屏幕空间反射再说一下环境光遮蔽,确切的说是屏幕空间环境光遮蔽,也就是SSAO(Screen Space Ambient Occlusion)。

                  (个人觉得这个“大幅”其实并不准确....SSAO开与不开并不会大幅影响游戏性能。)

                  典型的SSAO效果,一般在大于45度的折角附近特别明显。


                  IP属地:广东18楼2020-02-20 13:44
                  回复
                    接下来说说SSAO是干什么的。
                    从这张图可以看出,太阳光的位置是在右侧。
                    根据Lambert光照定理(Lambert Law of Cosine),亮度取决于:(太阳光方向单位向量 )点乘(-物体表面法线单位向量)
                    所以说,理论上讲,没被太阳光照到的位置都应该是黑的。
                    可是那多难看呀,而且不真实。
                    大白天的,哪个楼在太阳阴面的部分,也不是全黑的啊。


                    IP属地:广东22楼2020-02-20 14:10
                    回复
                      一个贴子被连续吃了五次......


                      IP属地:广东24楼2020-02-20 14:13
                      回复
                        原因其实也很简单,除了太阳之外,物体还获得了来自各种间接光、反射光的能量。
                        最主要的就是来自天空的。


                        IP属地:广东29楼2020-02-20 14:20
                        回复
                          这样做有一个小问题,那就是折角和窝进去的地方。比如这种:
                          相比平面,窝里的地方想要被点亮,需要光线反射更多次。
                          而光线每次反射都会造成能量损耗。
                          也就是说,实际上,物体表面的折角和窝进去的地方都比其他部位更暗。
                          因此SSAO并不是真的模拟了间接光反射(那个需要Path Tracer,渲染电影才用的,15分钟一帧),而是让虚假的间接光反射看起来真实一些。


                          IP属地:广东31楼2020-02-20 14:21
                          回复
                            终于发出来了。。。。。


                            IP属地:广东32楼2020-02-20 14:22
                            回复
                              2026-06-01 22:47:07
                              广告
                              不感兴趣
                              开通SVIP免广告
                              其实在次世代PBR流程的一套贴图里面,是有AO贴图的。
                              但是这个仅针对小物体,比如铠甲:
                              注意铠甲上带锯齿的黑圈。

                              但是,对于整个天鹿城这么大的模型,不可能每面墙都有自己独立的贴图。
                              也就是说,必然有相当一部分屋子是复用了墙体的。所以...就没法用AO贴图了。


                              IP属地:广东34楼2020-02-20 14:29
                              回复