Games104 听后笔记

1、为什么UE5要自己写一套STL库

因为传统的STL库中,例如:vector,它一般采用的是双倍扩容法,加入1000个数据装满了,现在需要又加一个,那么就开辟了2000个数据的空间,那么当前就又999的数据空间暂时浪费掉了,这是实时渲染不希望看见的,这样会非常消耗性能,从而偏离实时的要求

2、通常引擎会写一个Tick,一个主要做逻辑,一个主要做渲染

3、引擎分为功能层、数据资源层以及平台层、核心层、工具层

功能层包括:动画功能、物理功能、渲染功能、HUD功能,Camera、输入、脚本、AI等基础功能

数据层包括:音频文件、视频文件、模型文件、XML文件等等

平台层包括:Linux、Windows、Android等等

核心层:就是核心的容器数据结构等等

工具层:外部导入的第三方库、插件等等

4、软件架构规则:数据放在一起、访问数据尽可能顺序的去访问,读写时一起去读写

5、DCC工具:外部工具:Houdini、3DMax、Maya等等

6、Component-based Tick

它是模块逐级处理,而不是处理一个物体的所有行为,然后再处理其它物体的所有行为

它是通过处理所谓物体的逻辑,然后处理所有物体的输入以此类推

7、Scene Management

和Ray Trace一样,分为Oct-Tree 、BSP,思想都是一样的,就是通过包围盒,快速检索

8、同一个木材质,会合成组,在Resource Pool中存储,以此来减少DrawCall,提高性能开销,模型同理,也是通过模型和实例(instance)去做Resource Pool中存储管理

9、Visibility Culling

 

和Ray Trace一样,分为Oct-Tree 、BSP,思想都是一样的,就是通过包围盒,快速检索

这个和UE5的世界分区有点像,UE5世界分区是先将世界分成多个正方形,然后根据调整的距离Distance进行剔除,超过这个距离的正方形的物体就进行剔除,看不见的也剔除

10、Cascade Shadow(级联阴影)

根据距离做不同密度的Shadow

软阴影做边界的Blend

3A常用的阴影是Cascade Shadow + VSSM

11、地形系统使用的四叉树

在FOV中的地形曲面细分会更好,细节处理更好,当然这个也需要结合距离一起去考虑

根据高程和卫片来去将地形分块,对每块的高程进行顶点位置的设置,以及卫片的RGB信息的绘制


这是另一种方法,永远将三角形的对角线切一刀


还有第三种方法,就是平面我就用很少的三角面描绘,而细节度较高的就用多的顶点去描绘这个形状


当然高程和卫片表示不了这样的效果:

山洞的效果是描绘不出来的

这种凹形的效果也是高程和卫片表示不出来的效果

这个时候就通过在高程和卫片上将这块的高度信息设置为NaN,RGB信息也去除,然后通过人工建模的方式去实现这种效果


12、后期材质的Bloom泛光效果是怎么实现的?

具体来说就是将原本的像素,不断降级缩放,在最小级的情况进行模糊,再和原来的图像进行按自定义的比例进行融合,就形成了Bloom的效果


13、什么是ToneMapping?

由于光线直接照射的部分会非常亮,没有照到的地方会非常暗(经过了GI过后也是,反射次数不够),那么久调节曲线来使得画面效果更加均匀


2D动画利用了视觉残留,然后通过各个动作的图片做成序列,进行播放,从而产生的Animation


将所有的图元分开,在各个图元上定义捕捉点

根据定义的捕捉点,进行对2D的图片进行Animation的操作了


DoF中文翻译叫做自由度,一个3D世界中,X\Y\Z轴的移动是三个维度自由度,YawPitchRoll是旋转的三个维度的自由度,ScaleXYZ也是三个维度的自由度,所以在一个3D世界中,DoF为9


早期的动画,是将人物的关节作为骨骼去进行移动,这样会产生缝隙的问题


顶点动画,是通过一张图片来去做的,从左往右是顶点的偏移值,从上往下是帧播放的方向,从上往下的各个位置的顶点的偏移量从而形成动画,这里的例子为:布料系统和水体系统的一个模拟


这里对嘴巴附近进行真实的捕捉,然后对模型的嘴巴进行动画效果,例如张嘴,这里对每个网格的变化会根据权重进行变化强度的分析


蒙皮动画是当今最常见的动画方式

每个动画都会有多个骨骼进行控制和限制,从而达到更好的效果


刷上蒙皮,这些蒙皮提前定义好骨骼对蒙皮的影响程度


骨骼实际上是一个树状结构,子骨骼是根据父骨骼的Transform信息来计算自身的Transform信息


粒子排序的方法:

1、通过整体排序,当多个发射器发射众多粒子时,将发射器发射的粒子整体存起来,然后拿所有的粒子全局的一个一个的去排序

由于粒子数量众多,计算的像素过多,就将场景深度降低采样个数(降低分辨率),然后将粒子的RGB图和Alpha图进行一个混合,再将混合好的图片进行双向采样,再与原来的场景颜色进行一个混合,从而提高性能

粒子通常有一个Particle Pool进行管理:分为还存在场景的粒子List和已经死亡的粒子List,里面分别存放的事Particle Pool的索引号,从而进行粒子的管理


为什么GI和Ray Traced会产生Noise?

因为光线的反射不能无限进行(极度消耗性能),计算机算力不够所产生的不能充分采样,从而让画面有又亮又暗(采样不足),这里用Temporal的方法进行处理,这个在202已经有详细的说明,这里不做赘述


Lumen:

通常Surface Card是对一个物体的上下前后左右分别拍出照

将场景里面拍好的物体(Surface Card)放到Surface Cache里面,进的用精细的图片存放,远的用粗糙的图片存放

但整体上采样在屏幕中的大小基本一致(平均)


Nanite:

将生成的Mesh分成很多Cluster(簇),每个簇又生成各自的碰撞盒子,这样如果实现看不到打不到的簇就会被隐藏不被渲染,如果移动相机视角看见了,就直接通过Streaming加载出来

在这里首先要补充一下V-Buffer(Visibility-Buffer)的概念

Visibility Passes: 对场景进行光栅化,将Primitive ID和Instance ID(或Material ID)保存到ID Texture里(顺手做个Depth Prepass),也就是说只有可见的Primitive才会进入后续的阶段;

Worklist Pass:构建并Worklist,这一步是为了驱动下一步,将屏幕划分成很多tile,根据使用到某个Material ID的tile加到该Material ID的Worklist里,作为下一步的索引;

Shading Passes : 使用Compute Shader对每个Material ID进行软光栅,获取顶点属性并插值,然后再进行表面着色。

从而解决G-Buffer带宽增加的问题

Visibility Buffer的基本思路是在前一个Pass中生成一个类似于GBuffer的全屏Buffer,其中的每个texel存储的是一个索引值。这个索引值通常为PrimitiveID。在之后的Pass中可以通过这个PrimitiveID来索引到所在图元,进而得到与之关联的所有属性值,法线、粗糙度等等。有点类似C++里的指针。这样做的目的是避免像传统的延迟渲染那样需要在前一个Pass生成多个buffer来存储不同的属性值,并且需要传给后一个负责渲染的Pass。由于存储和传递的只是ID索引从而极大的降低带宽的压力。带来的额外工作是需要自己手动进行原本由硬件光栅化自动完成的插值

参考:UE_Visibility Buffer & Deferred Material_webgis 获取管线buffer-CSDN博客

Nanite是用V-Buffer和G-Buffer进行一个混合使用,从而达到更好的一个效果

首先Nanite和以前的LOD的最大的区别是,Nanite可以在一个模型中分为很多不同级别精度的渲染,而LOD只能做一个模型整体精度的渲染

Nanite的思想是保持边界不动,分成不同级别个数的簇Group,再在不同级别的Group中保持边缘不动,减少三角形个数,切记!!!这个Nanite它不是树状结构,Group在不同级别下的簇,不一定是包含关系,是依赖关系!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值