Unreal 《实时渲染深入研究》 学习笔记
##导论:带宽会影响渲染,尤其是内存和GPU之间的带宽,UE4默认使用deferred shading.
延迟和向前的差异:
延迟:1.使用G-Buffer 2.动态光照友好 3.稳定和可预测 4.no msaa 向前: 1.在向FrameBUffer写入之前,一个pass中计算所有内容 2.混合不友好
3.透明效果友好 4.简单的效果速度很快 5.动态光照消耗巨大 6.可以msaa
渲染之前的遮挡剔除
渲染时的线程有:1.CPU游戏逻辑线程 **2.CPU Draw线程 ** 3.GPU线程。但他们不是同步的、是有延迟的。
1.CPU逻辑线程需要在每帧中处理:动画、位移、物理、ai、生成和销毁、隐藏和出现等等(所有和位移相关的事情)
2.CPU Draw(主要泡在Cpu,部分泡在GPU)线程已经等待了1帧,他要做的事情是:遮挡计算(建立一个所有可见对象的列表,逐对象处理)。
会顺序执行(s顺序会减少消耗):距离剔除(Distance Culling,超过摄像机距离阈值的剔除,他不会被送到下一个阶段)、裁剪体剔除(Frustum Culling)、预计算可见性(Precomputed Visibility,它建立一个grid,每一个grid记录了在这个grid中那些对象是可见的,当摄像机进入某一个grid,会把可见对象传入下一个阶段)、遮蔽剔除(Occlusion Culling,这是最复杂的一步,他会检查每一个对象的可见性,可能是通过包围盒之类的来做遮挡关系,被挡住一般都是静态的对象。注意很大的物体不会被剔除,这会增加GPU的开销,因为,在GPU阶段,大的模型上的额外的三角面都会被进行渲染计算,虽然他们不会被写入FramBuffer。但大的模型这会减少CPU的开销,所以物体的大小需要根据游戏需求来平衡)
渲染几何化阶段
1.Early Zpass:渲染是逐对象进行的,按照物体的深度进行预渲染,形成一个物体对象前后关系的遮罩
2.GPU 一个DrawCall一个DrawCall的渲染(一个材质一个材质),CPU在一帧中执行了逻辑计算和剔除计算后,会产生一帧的DrawCall命令流,同时将这个命令流和需要渲染的数据发送给GPU(同时开始准备下一帧的数据和命令),GPU根据命令流与数据进行绘制,GPU是一个DraeCall一个DrawCall进行绘制的,当完成所有的DrawCall完成后,Gpu写入FrameBuffer,我们看到一帧画面。这时如果Cpu处理的DrawCall太多,意味这这一帧他需要更长的时间(因为他要为每一个渲染对象进行数据配置,指定Shader等一系列操作),而GPU的工作速度是很快的,这时候Gpu就得等着CPU完成下一帧的所有数据和DrawCall命令流的准备。延迟就产生了。相对于多边形数量,Draw Call的性能影响要大的多。
3.减少Draw Call的方法:使用大一点的模型,但不能过大,因为他会影响:CPU遮挡计算,影响LightMap的计算,影响碰撞体,带宽和内存影响
4.**Instance Static Rendering?(看一个Unity Shader源码和UE 材质制作) **和 instance memory的区别? LOD的使用,LOD节省的性能必须足够补偿使用LOD的消耗,HLOD
5.vertex Shader
光栅化阶段:
光栅化是按照逐DrawCall来进行的,也就是说,同一个材质的物体的所有三角形会在一个过程中进行像素坐标计算、SHader着色、写入G-buffer.
Over Shading的问题:当polygon很小时,它会覆盖很小的像素区域,但是可能覆盖很多的Quad(四个像素租场一个quad,GPU是逐quad来计算的),当一个quad
中只有一个像素有颜色的时候,却另外三个陪着他一起计算,这就是OverSHading的第一阶段.当另外的一个临接三角形也覆盖到这个quad中的其他像素是,这个quad ### 会在计算这个三角形时又被重新计算一遍,这是Overshading的第二阶段。于是远距离渲染会造成跟多的overshading,因为polygon变小了,与之对应的解决办法就是
LOD
渲染和纹理
纹理导入UE一定会被压缩 DXTC(PC)、法线BC5(只存RG通道)
shader采样贴图数有数量上限
mipmap会被保存在压缩后的纹理本身,texture streaming的要求是分辨率是2的指数,在pixel shader中通过像素之间的差值来确定采样哪个mipmap
着色和材质:
1.ue4中有一些shader源码,通过材质编辑器,创建新的shader代码(会编译成很多版本),然后再通过材质实例,派生shader实例(为了不同的变量输入)
2.pbr 是unified shading :可以规定标准的贴图制作方法,并且pbr是适应G-bufer的一种统一着色模型
3.Shader写完后会被编译成许多版本,每一个版本其实是这段Shader+其他功能的组合
4.shading moudle,着色模型是由G-buffer生成的一系列mask:pbr model, lambert modle,skin model,ue4用一系列的mask来决定object用那种shading model
5.texture streaming :贴图的分辨率瓶颈在于从内存传送到现存的贷款,它会影响加载卡顿,和场景低分辨率渲染的问题,但不会持续的影响帧率
texture pool
在像素着色器中有贴图采样数的限制,如果使用DX11则可以扩展采样贴图的数量。有一些贴图,比如反射使用的cubmap或渲染贴图,lightmap等都会算在贴图采样数
反射
三个反射系统:1:reflection capture 与计算cube map + 像素时时采样混合(capture reflection可能会导致性能变慢,如果有很多重叠的capture,计算像素时会采样很多cubemap导致性能下降) 2:planner reflection 内置摄像机在对面渲染,然后采样 3:ssr:屏幕空间反射(形成噪点的原因是从屏幕上投射的ray密度很小,所以反射采样的颜色少)
skylight就是一个打的reflection capture
静态Lighting
与计算并存储在lightmap中,把光照和阴影烘焙在一张大的贴图上,并对mesh的顶点增加新的uv,像素着色器阶段时,采样这张贴图
lightmap的作用:
lightmap需要结合Lghtmass Importance Volume一起使用
Indirect Lighting Cache 用来解决动态物体的光照预计算问题。在烘焙lightmap时也会创建一个3维网格,里面的每一个向量存储光照颜色强度,当动态物体靠近时,
向量中存储的光照信息会影响动态物体
动态Lighting
查一下文档 三种光的类型说明
四种动态阴影:1.常规动态阴影:光源是移动的,尽在像素着色器阶段采样Shadowmap,然后混合底色,非常的死板,没有反弹和真实感
2.逐对象阴影:Stationary Light Shadows
3.Static Shadow
4.Cascaded Shadow Maps(CSM) distance field shadow算法? Volume Texture? Inset shadow ? Constant shadow? Capsule Shadow
点光源如何产生阴影?如何计算球体内的像素的光源颜色?polygon的面数会影响阴影性能能?
点光源半径内的物体会受该点光源影响,不同点光源交界处会被每一个点光源影响。
光照方案需要用一些混合方案 static + movative = stationary
distance field soft shadow GDC Article https://twvideo01.ubmus.net/o1/vault/gdc2018/presentations/Aaltonen_Sebastian_GPU_Based_Clay.pdf
http://jamie-wong.com/2016/07/15/ray-marching-signed-distance-functions/
https://zhuanlan.zhihu.com/p/34494449
df 通常 远距离阴影上面
雾的渲染
UE4的两种distance fog: Atmospheric(大气雾) , Exponentional(指数雾)
页:
[1]