Unity3D的渲染路径的细节一览表


请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com

1 功能列表

功能 Vertex Lit Rendering Path Forward Rendering Path Deferred Rendering Path
逐像素光照效果(Normal map等) N Y Y
多render pass支持 仅在一个render pass中完成光照计算 允许多render pass 允许多render pass
逐像素实时阴影 N 仅支持一盏Directional Light Y
双光照贴图(Dual Lightmaps) N N Y
深度缓冲区和法线缓冲区 N Additional Render Pass Y
软粒子(soft particle) N N Y
半透明的物体(Semitransparent objects) N Y Y
反走样(抗锯齿 anti aliasing) N Y Y
灯光剔除蒙版(Lighting Culling masks) 受限制 Y Y
光照保真度(Lighting Fidelity) 所有光照计算在顶点着色器中执行 部分光照计算在片元着色器中执行 所有光照计算在片元着色器中执行
每像素光照的性能耗费 像素数 像素数*被实时光照亮的像素数
----
PC上的所需的最低shader model版本 任意版本 最低2.0 最低3.0
移动平台上所需的最低OpenGLES版本 最低1.1 最低2.0 不支持移动平台
支持的游戏主机平台 N xbox360,PS3 xbox360,PS3

Forward Rendering Path会依据一定的策略,分别判断场景中所启用的实时灯光是采用逐像素光照,球面调和光照,还是用逐顶点光照。也即是说,在Forward Rendering Path中,可能同时存在着三种光照计算方式,判定方式如下:

  1. 渲染模式被设置为不重要(Not Important)的光源以逐顶点或球面调和的方式进行计算
  2. 最亮的Directional Light将使用逐像素光照计算方式参与计算
  3. 渲染模式被设置为重要(Important)的光源将使用逐像素光照计算方式参与计算
  4. 如按照以上的三个规则,所得到的参与逐像素计算的光源数量,小于质量设置中的像素光源数量(Pixel Light Count),为了减少亮度,会有更多的光源以逐像素的方式进行光照计算

2 Forward Rendering Path 的细节

Forward Rendering Path将会采用多个render pass去执行光照计算。如下表:

  1. 在基础通道(base render pass)中对所有的逐顶点光照计算的光源,以及所有的使用球面调和计算方式的光照,进行计算,还有就是对其中一个Directional Light进行逐像素计算
  2. 在其他的render pass中,对光源进行逐像素光照计算,每个光源都需要一个render pass

base render pass用所有球面调和光,以及一个逐像素计算的directional light去渲染物体。此通道还负责渲染着色器中的光照贴图,环境光和自发光。在此通道中渲染的方向光可以产生阴影。需要注意的是,使用了光照贴图的物体不会得到球面调和光的光照。其他的render pass用于其他的使用逐像素计算方式的光源。这些通道中渲染的光源无法产生阴影(因此,forward rendering支持一个能产生阴影的方向光)。具体的渲染步骤和流程如下示例:

例如,如果有一个物体受到若干光源的影响(下图中的圆圈,受到光源A到H的影响)

假设光源A到H都有相同的颜色和强度,且它们的渲染模式都为自动的(Auto),那么它们严格的按照其名字排序。最亮的光源以逐像素光照模式的方式进行渲染(A到D),然后最多有4个光源以逐顶点光照模式进行渲染(D到G),其他光源以球面调和的方式进行渲染(G到H)。

注意不同的光照组间有重叠,如,最后一个逐像素光源也以逐顶点光照模式的方式渲染,这样能减少当物体和灯光移动时可能出现的"光照跳跃"现象。

3 Defered Rendering Path的细节

Defered Rendering Path也会使用多个render pass去执行渲染操作,步骤如下表:

  1. 第一步是base render pass,在本render pass中,每个物体都会被渲染一次。物体的基于观察空间的物体法线(view space normal)镜面高光强度(specular power)被渲染进单一的ARGB32格式的rendered texture中(法线值在RGB通道,高光强度在A通道)中。如果平台和硬件支持将Z缓冲按纹理读取,那么物体的深度值不会被明确的渲染。如果Z缓冲不能被以纹理的方式访问,那么深度将在其他的render pass中使用“shader replacement”技术进行渲染。本render pass的渲染结果是被当前屏幕内容的深度值所填满的Z缓冲,以及带有法线和高光强度的rendered texture

  2. 第二步是lighting render pass。本render pass基于在base render pass中得到的深度,法线和高光强度值去计算光照。光照是基于屏幕空间进行计算的,因此和屏幕复杂性无关。在本lighting render pass中使用到的光照缓冲(lighting buffer)是一个单一的ARGB32格式的rendered texture,纹理的RGB通道带有漫反射的光照信息,在A通道带有单一特定颜色的光照值。这光照值采用“对数编码(logarithmic encoding)”的方式进行编码,以产生比一般ARGB32纹理所能存储的更大的光照值范围。在本render pass中光照模型固定为Blinn-Phong模型。那些不和摄像机的近截平面(near plane)相交的point光源和spot光源,将会作为一个3D形状去渲染。并且是以“z buffer test against scene enabled”的方式去进行渲染。这将使得部分或者全部闭合的(occluded)point光源或者spot光源的渲染性能耗费变得极为低廉。如果和摄像机的近截平面相交的directional light,point light,spot lights则以一个全屏的四边形的方式去进行渲染。如果一个光源,它的“产生阴影”的选项被启用了,,在这个处理过程中会被很好的地染。但注意产生阴影并不是毫无性能损耗的,同时需要使用一个更加复杂的光线着色器来进行渲染操作。

  3. 最后一步是final render pass,最终渲染阶段产生最后渲染后的图像,到这一步,所有的对象都将被再次渲染,其中着色器将混合前一步生成的光源和纹理以及所有自发光照明。

返回首页