Unreal Engine Real-Time Rendering Class(四)

Rasterization, Overshading and the G-Buffer

  • 光栅化过程就是将3D数据转换为像素的过程:
    Unreal Engine Real-Time Rendering Class(四)_第1张图片

    光栅化根据draw call依次执行

  • 由于硬件设计的原因,像素不是一个个处理的,而是以2*2的像素方格来处理的。这意味着如果一个多边形很小或者很薄,它可能会对4个像素着色,而最终只有一个像素有颜色,这被称为过度着色(overshading)。所谓过度着色就是让着色范围超出本应有的区域

    看下面的例子,假设多边形最终会让三个绿色区域的像素有颜色(这里只是假设,其实是不正确的。引擎会计算如果像素的中点位于多边形的内部,那么像素就会被着色),但由于像素必须以2*2的方格来处理,因此绿色区域像素所在的3组2*2方格内的12个像素(用橙色区域表示)都会计算着色:
    Unreal Engine Real-Time Rendering Class(四)_第2张图片

    接着又有一个多边形需要处理,该多边形最终会让两个蓝色区域的像素有颜色:
    Unreal Engine Real-Time Rendering Class(四)_第3张图片

    此时蓝色区域像素所在的2组2*2方格内的8个像素(用红色区域表示)都会计算着色:
    Unreal Engine Real-Time Rendering Class(四)_第4张图片
    总结一下,我们最终有5个像素有颜色,但我们处理了5组2*2方格总共20个像素
  • 多边形越密集,渲染开销越大;从远处看时,多边形的密度会增加;在远距离时,减少多边形数量(可以使用裁剪/LOD)很重要;像素着色器越复杂,过度着色的开销越大。因此过度着色在前向渲染中对性能的影响比在延迟渲染中更大。
  • 自定义深度会用单独的渲染纹理或者单独的G-Buffer来渲染对象
  • G-Buffer会占用许多内存和带宽,因此你能够渲染的G-Buffer图像的数量是有限制的
    Unreal Engine Real-Time Rendering Class(四)_第5张图片
    UE引擎渲染的G-Buffer

Rendering and Textures

  • 纹理在导入时默认会被压缩;每个平台的压缩方式都是不同的,在PC上用的是称为BC的压缩方式;法线贴图使用一种特殊的方式,称为BC5,只存储了R通道和G通道
  • BC3方式用于包含alpha的纹理贴图,BC1方式用于没有包含alpha的纹理贴图
  • 压缩纹理的原因在于内存和带宽有限
  • 纹理分辨率会影响内存和带宽,但不会影响渲染效率。当内存或带宽不够用时,会引起延迟和卡顿
  • 使用Mipmaps是为了防止纹理噪点:
    Unreal Engine Real-Time Rendering Class(四)_第6张图片
    左:使用Mipmaps 右:不使用Mipmaps

    使用了Mipmaps的左图表现为距离越远越模糊,因为距离越远使用的纹理的尺寸就越小。为了支持Mipmaps,纹理的尺寸必须是2的幂(例如64 * 64,256 * 256),不是正方形也没有问题(例如64 * 512)。


Shaders and Materials

  • UE4的着色器流程:

    UE4有一些模板化的着色代码:
    Unreal Engine Real-Time Rendering Class(四)_第7张图片
    这些模板被用来为材质编辑器提供支持
    Unreal Engine Real-Time Rendering Class(四)_第8张图片

    在材质编辑器中创建的内容最终会与模板代码合并,生成完整的着色代码:
    Unreal Engine Real-Time Rendering Class(四)_第9张图片
    着色代码中未定义的变量接着会由材质来定义:
    Unreal Engine Real-Time Rendering Class(四)_第10张图片
    材质最终被应用到对象上:
    Unreal Engine Real-Time Rendering Class(四)_第11张图片
  • 材质系统的很大一部分都是基于PBR的,PBR使用高光、金属度和粗糙度作为输入
  • UE4使用PBR的原因如下:
  1. 为了获得最佳效率。因为所有对象都是建立在PBR着色模型上的,所有就可以针对这个单一的着色模型来优化每一个细节
  2. PBR更具可预测性,可以改善美术的工作流
  3. 可以很好的适用于GBuffer

Reflections

  • UE4中有3种类型的反射:
  1. 反射捕获:在一个特定位置捕获一张静态立方体贴图,是预先计算的,因此速度很快,但不精确,并且只能展示捕获位置附近的局部效果:
    Unreal Engine Real-Time Rendering Class(四)_第12张图片
    圆圈代表捕获位置,当摄像机与捕获位置不一致时,会导致很不精确的结果
  2. 平面反射:适合那些需要精确反射的平坦表面,范围是有限的。如果开启了每帧动态计算,则开销会很大
  3. 屏幕空间反射(Screen Space Reflections,SSR):UE4默认的反射系统。开销很大,会有噪点,并且只能反射屏幕上出现的物体

UE4的反射优先级为:SSR、平面反射、反射捕获

  • 反射的性能影响:
  1. 如果项目没有烘焙的话,反射捕获在场景加载时会执行一次捕获,因此会导致加载变慢
  2. 许多反射捕获重叠在一起,会导致重叠处像素的像素着色器被重复执行。重叠在一起的反射捕获最好不要超过8个
  3. 只有在绝对必要的时候才使用平面反射
  4. 硬件条件有限的情况下需要关闭SSR

本文固定链接: https://www.jianshu.com/p/c1ddc587c2cf
转载请注明: EnigmaJJ 2019年2月18日 于 发表

你可能感兴趣的:(Unreal Engine Real-Time Rendering Class(四))