精华内容
下载资源
问答
  • Unity渲染练习素材

    2021-05-04 23:56:51
    Unity渲染练习素材——包括十种贴图使用素材,一套室内场景白模,其他素材
  • Unity渲染基础

    千次阅读 2019-05-30 13:36:17
    渲染 1.何为渲染? 所有我们能看到的东西都...Unity4.X:渲染使用的事AutoDesk的Beast技术; Unity5.X:渲染使用的事Enlighten引擎; Unity5.6后:渲染使用的还是Enlighten引擎,但是有了升级; 3.移动端渲染 移...

    渲染

    1.何为渲染?

    所有我们能看到的东西都是需要进行渲染的。
    比如:天空盒,场景模型,角色模型,特效......
    如果没有渲染,游戏世界将是一片黑暗。

    2.各版本渲染区别

    Unity4.X:渲染使用的事AutoDesk的Beast技术;
    Unity5.X:渲染使用的事Enlighten引擎;
    Unity5.6后:渲染使用的还是Enlighten引擎,但是有了升级;

    3.移动端渲染

    移动端的模型大多是使用两张类型的贴图作为渲染的素材:
    一张是漫反射贴图,一张是法线贴图。

    4.PC主机端渲染

    PC主机端(国外的大型单机游戏)大多是真实的模拟现实中的效果来进行渲染的,使用了很多种类型的贴图(Unity的标准着色器中有支持10种贴图类型)。
    PBR:基于物理规则的渲染方式。
    GI:全局光照,用于模拟光的互动和反弹等复杂行为的算法。

    核心要点

    1.标准着色器

    Unity5.X 后提供了两个标准着色器(Shader)。
    使用这两个Shader我们可以实现大部分物体的渲染。

    2.Lighting面板

    主要对场景中的灯光渲染进行统一的设置。
    场景灯光分:实时和烘焙。

    3.反射探头

    主要用于实现模型的反射。

    4.灯光探头组

    主要用于在烘焙后的场景中模型实时光的效果。

    Shader

    1.Shader的重要性

    shader好比是画家手中的画笔和颜料。如果画家没有了这两样东西后,根本就没办法画出好的作品。
    在 Unity 中所有看到的一切,都离不开 Shader 的渲染,无论是天空盒,场景,角色模型,特效。。。。。这些我们之所以能在游戏中看到它们,它们能显示出一个五彩缤纷的虚拟世界,其中都是 Shader 在起作用。

    2.Shader的学习步骤

    • Unity 内置 Shader 的使用;
    • 3D 数学基础学习;
    • 渲染管线的渲染步骤;
    • 在 Unity 内开发满足自己需求的 Shader。

    天空盒与内置Shader介绍

    1.颜色空间

    两种颜色空间:

    Gamma 空间:移动端,页游,HoloLens,性能比较低的硬件设备。
    Linear 空间:PC 端,主机端。

    Unity 默认的颜色空间(Color Space)设置选项是选择为 Gamma,但是如
    果我们使用 PBR 渲染流程(标准着色器)就必须将颜色空间修改为 Linear。

    修改颜色空间

    Edit --> Project Settings --> Player
     --> Other Settings -->Rendering -->
    Color Space --> Linear

    2.天空盒

    天空盒的作用

    • 用于渲染显示天空和周围的环境;
    • 作为场景中的辅助光源;

      制作天空盒

    • 导入“HDR 环境贴图”素材图片;
    • 将 HDR 贴图的“Texture Shape”修改为 Cube;
    • 创建一个材质球,材质球选择 Shader 为 Skybox/Cubemap;
    • 将贴图素材赋予给材质球。

      使用天空盒

    • Lighting 面板上的 Skybox 选项设置要使用的天空盒。
    • 直接将天空盒拖拽到场景中。

      天空盒材质参数调整

    • Exposure:调整贴图的亮度。
    • Rotation:旋转贴图,很多时候贴图上有太阳,我们可以通过旋转让贴图上的太阳和场景里面的方向光重叠。

      内置 Shader

      Unity 中内置的 Shader 分可以分为三组,他们具备不同的作用和使用场合:

    1.Unity5.x 新 Shader
    2.Unity5.x 标准 Shader(用于 PBR 渲染)
    3.Unity4.x 旧版 Shader(用于支持旧版项目的渲染)

    标准Shader之四大渲染模式

    1.四大渲染模式

    1.Opaque(不透明)

    作用:用于渲染所有不透明的物体,这类物体在场景中是最多的。60%的比例。

    2.Cutout(镂空)

    作用:用于渲染有镂空的物体,这类物体在场景中并不太多。5%的比例。

    3.Fade(隐现)

    作用:用于渲染实现物体的渐隐和渐现。这类物体在场景中也不多。5%的比例。

    4.Transparent(透明)

    作用:用于渲染有透明效果的物体,这类物体在场景中也比较多。30%的比例。

    2.标准 Shader 功能布局

    1.渲染模式区域

    当创建完一个材质球,并设置 Shader 为标准着色器后,第一步就需要根据这个材质球要渲染的物体的特性(不透明物体,透明物体)设置不同的渲染模式。

    2.主贴图区域

    用于设置 Shader 的主要贴图,使用这个区域的贴图和设置项控制模型最终的渲染效果。80%的模型,我们只需要设置这个位置的贴图就够用了。

    3.次贴图区域

    用于设置 Shader 的次要贴图,用于给模型增加细节。一般不会用到这个位置的设置项。但是一些需要近距离观察的模型,设置完上方的主贴图,再设置下方的次要贴图,能增加模型的精致度。

    标准Shader之十种贴图类型

    1.标准 Shader 诞生

    1.背景了解

    • Unity4.x 阶段,Unity 老被拿来和 UrealEngine(虚幻)进行对比,得到的结论就是 Unity 是“渣画质”,Ureal 是“高大上”。但是相对而言 Unity易于学习,开发速度快,跨平台多,就业岗位多,却也是 Ureal 比不了的。
    • Unity4.x 阶段的画面渲染使用的是 AutoDesk 的 Beast 技术;Unity5.x阶段彻底放弃了 Beast 技术,改为使用和 UrealEngine 一样的一款第三方渲染引擎 Enlighten 来进行画面渲染。
    • Unity 为了配合这个新的渲染引擎,推出了“标准 Shader”。
    • 理论上,我们可以使用 Unity5 制作出和 UrealEngine 差不多的画面效果。

      2.标准 Shader 的优点

      使用一个 Shader 完成大部分场景模型的渲染;无论是人物角色,金属,塑料,皮革,布料,玻璃,建筑......都可以使用一个标准 Shader 来完成渲染。

      3.标准 Shader 贴图

      标准 Shader 使用的是 PBR 渲染,基于现实物理效果的渲染表现形式。一个模型能不能使用标准 Shader 来进行渲染,是在做这个模型的贴图的时候决定的。有没有按照 PBR 贴图的制作规范和模式来制作,决定了该模型是否可以使用标准 Shader 渲染。

    2.常用贴图介绍

    1.两种标准 Shader

    Unity5.x 中的标准 Shader 有两个:
    Standard:标准着色器
    Standard(Specular setup):标准着色器(镜面)

    2.Albedo 贴图

    Albedo:反照率[贴图];用于体现模型的纹理,颜色。

    反照率贴图本身是一张颜色与纹理的贴图。

    该选项有贴图属性,也有颜色属性。

    两个属性可以单独使用,也可以组合使用;

    当颜色属性为纯白色时,则不影响贴图的效果;

    当颜色属性为其他颜色时,则叠加贴图效果。

    3.Metallic 贴图

    金属度[贴图];用于体现模型的金属高光反射;

    金属度贴图本身是一张灰白图,越白的地方,金属度越强烈,越黑的地方金属度越低。

    Smoothness:平滑度

    介于 0 和 1 之间的一个值,越小,平滑度越低,越大,平滑度越高。

    4.Normal Map 贴图

    Normal Map:法线贴图;用于增加模型的细节;

    法线贴图本身是一张蓝色的凹凸图。

    5.Occlusion 贴图

    Occlusion:AO 贴图;

    AO 贴图本身是一张灰白图。

    主要用于改善阴影,给场景(模型)更多的深度,有助于更好的表现模型的细节。

    6.Specular

    Specular:镜面[贴图],类似于“Metallic 金属度”贴图。

    PBR 贴图的制作方式不同,最终关于“金属部分”的表现,出现了两种类型的贴图,Metallic 和 Specular。

    7.Detail Albedo x2

    Detail Albedo x2:细节反照率[贴图];

    作用是对主 Albedo 贴图的一个细节深入表现;

    8.Normal Map x2

    Normal Map x2:细节法线[贴图];

    作用是对主 Normal Map 贴图的一个细节深入表现;

    9.Detail Mask

    Detail Mask:细节遮罩[贴图];

    这个贴图是配合“次贴图区域”中的 Detail Albedo,Normal Map 两张贴图配合使用的,次贴图区域中的这两张很多是平铺的贴图,效果会作用于模型的全部,我们使用 Detail Mask 将一些不需要被“次贴图”影响的部分独立出来。

    10.Emission贴图

    Emission:自发光[贴图],让模型自发光;

    Unity里面能够作为光源存在的除了灯光组件和天空盒,标准Shader里面的Emission贴图也是可以作为一种光源的。

    11.Height Map贴图

    Height Map:视差[贴图],比Normal Map更有立体感的一种贴图方式;

    主要用于地面,建筑等效果的体现。

    PBR效果

    • 3dMax/Maya制作模型白模
    • Substance Painter制作PBR贴图
    • Unity5.X进行合成使用

    PBR质感表现之金属材质

    1.金属度的重要性

    在 Unity5.x 中,金属度是相对而言是最关键的一个可调整参数。

    我们在 Unity 中模拟现实生活中的东西,很多时候都需要控制它们的金属度。

    2.代码修改 Shader 参数

    1.Shader 源代码下载

    Unity 每次版本更新的时候,不单单会更新 Unity,配套的资源也是会一块更新的,比如版本配套的 Shader 源代码。[见图]

    2.相关 API

    获取 Shader 中参数的值:

    material.GetFloat(" 参数名 "); //获取小数类型值
    material.GetColor(“参数名”); //获取颜色类型值;  
    material.GetTexture(“参数名”); //获取贴图类型值;

    修改 Shadder 中参数的值:

    material.SetFloat(“参数名”,值); //设置小数类型值;  
    material.SetColor(“参数名”,颜色值); //设置颜色类型值; material.SetTexture(“参数名”,贴图); //设置贴图类型值;  

    2.金属度总结

    1.两个参数

    Metallic 有两个参数,贴图和滑块条,滑块条控制的参数是 0~1。

    金属度贴图是一张黑白图,就是用这些黑到白的颜色,存储 0~1 相关的信息值。

    滑块条是调整的整体,调整的时候,整个模型都是统一的一种效果;

    贴图则可以分区域控制金属度的高与低,使得模型金属效果更有层次。

    PBR 质感表现之玻璃质感

    两个参数

    Albedo 有两个参数,贴图和颜色面板,颜色面板里面的 Alpha 通道是 0~255。

    Albedo 贴图是一张纯色纹理图,贴图是可以存 Alpha 通道的。

    颜色面板里面的 Alpha 通道,调整的时候,整个模型都是统一的一种效果;

    贴图则可以分区域控制透明度的高与低,使得模型透明效果更有层次。

    画面增强之后期屏幕渲染特效

    1.后期屏幕渲染特效

    1.概念介绍

    后期屏幕渲染特效,也叫做摄像机特效。

    后期屏幕渲染特效是我们游戏画面后期处理时使用的特效,是作用于游戏场景中的摄像机游戏物体上的。

    比如现实生活中摄影师拍照:

    ①人物角色的化妆就好比我们在 Unity 中用 Shader 材质球美化模型;

    ②拍照时各种辅助的灯光好比 Unity 中的灯光系统,营造氛围;

    ③拍照完毕后,后期还需要用 PS 制作修改一些地方,这一步的操作,在我们的游戏开发过程中对应的就是“后期屏幕渲染特效”。

    2.ImageEffects

    1.ImageEffects 介绍

    ImageEffects 是 Unity 中附带的资源包之一,资源包存放了大量的摄像机特效,摄像机特效相关的脚本只能挂载到摄像机上进行使用。

    资源包导入步骤如下:

    Project 面板右键-->Import Package-->Effects

    2.注意事项

    ①摄像机特效资源包导入后,Component 最后一项会出现“Image Effects”选项,通过这个菜单,可以给选中的摄像机游戏物体添加相应的特效。

    ②这个摄像机特效资源包中所有的特效,分成九大类[见图],30 多个特效脚本。

    ③摄像机特效是允许效果叠加的,也就是说我们可以在摄像机上合理的组合使用多个后期屏幕渲染特效。

    ④另外 Unity 的资源商店里也有大量的第三方后期屏幕渲染特效资源。

    3.场景美化案例

    1.Antialiasing[抗锯齿特效]

    位置:Image Effects --> Other --> Antialiasing

    电脑显卡渲染出来的 3D 模型物体,物体的边缘会出现锯齿,影响视觉体验。可以使用“抗锯齿特效”平衡这些锯齿。

    Technique:抗锯齿算法,这里有七种类型的算法可供选择使用。

    2.Bloom[泛光特效]

    位置:Image Effects --> Bloom and Glow --> Bloom

    泛光是一种增强版辉光,光晕效果。

    Mode:模式,基础模式和复杂模式。

    Threshold:阈值,控制泛光的范围。

    3.Screen Space Ambient Obscurance[屏幕空间环境 AO 效果]

    位置:Image Effects --> Rendering --> Screen Space AO

    可以实时模拟场景中的环境遮挡效果。

    4.Noise And Scratches[噪音和划痕特效]

    位置:Image Effects --> Noise --> Noise and Scratches

    给场景效果添加噪点和划痕,可以用于模拟老电影的画面效果。

    Unity5.6.0 新版渲染功能介绍

    1.标准 Shader 更新

    1.Emission 参数

    5.5.1 版:Emission 贴图的的属性功能是直接展现在面板上的;

    5.6.0 版:Emission 贴图需要勾选“复选框”才可以展现相关属性。

    2.Advanced Options 区域

    5.6.0 比 5.5.1 新增了一个 Advanced Options(高级选项)区域。

    2.Lighting 面板更新

    1.版本更新对比

    环境光区域:新版和旧版是一致的,未发生改变。

    实时渲染区域:旧版有渲染分辨率和 CPU 使用量的参数,新版本去掉了这两个参数。

    烘焙渲染区域:新版本将烘焙(光照贴图方式)的的参数单独提取成了一个新的区域,Lightmapping Settings。整体参数和旧版几乎一致。

    3.Light Explorer 新功能

    1.Light Explorer [灯光管理器]

    给场景中的灯光,反射探头,灯光探头组,静态自发光物体提供了一个统一的控制和管理的面板。

    展开全文
  • Unity渲染流程概述

    千次阅读 2019-12-04 19:58:29
    本篇的任务是回答:在Untiy的渲染流程中CPU和GPU分别做了什么。 渲染到设备屏幕显示的每一帧的画面,都经历几个阶段的加工过程: 应用程序阶段(CPU):识别出潜在可视的网格实例,并把他们及其材质提交给GPU以供...

    本篇的任务是回答:在Untiy的渲染流程中CPU和GPU分别做了什么。

    渲染到设备屏幕显示的每一帧的画面,都经历几个阶段的加工过程:

    • 应用程序阶段(CPU):识别出潜在可视的网格实例,并把他们及其材质提交给GPU以供渲染。
    • 几何阶段(GPU):进行顶点变换等计算,并将三角形转换到齐次空间并进行裁剪。
    • 光栅化阶段(GPU):把三角形转换为片元,并对片元执行着色。片元经过多种测试(深度测试,alpha测试等)之后,最终与帧缓冲混合。

    CPU的工作流程:

    CPU

    1. 准备好需要被渲染的对象。也就是哪些物体需要被渲染,哪些物体需要被剔除(culled),剔除的常用方式包括视锥体剔除和遮挡剔除,并对需要渲染的对象进行排序。
    2. 设置每个对象的渲染状态。渲染状态包括所使用的着色器、光源、材质等。
    3. 发送DrawCall。当给定一个DrawCall时,GPU会根据渲染状态和输入的顶点数据进行计算。 

    Unity的渲染顺序可以简单的理解为是从近到远(实际上要复杂的多)。根据渲染对象的排序,会为每一个渲染对象的每一个材质,生成一个渲染批次batch。在不考虑动态批处理和静态批处理的情况下,总的batch量就是每个渲染对象所包含的材质的总和。但是因为存在动态/静态批处理的情况,所以实际产生的batch数量要小于前面计算的总和。

    在我一贯的测试过程中,SetPass call与渲染状态的切换是最吻合的,所以我将SetPass call简单的理解成设置渲染状态。但是,要说明的是,这只是我的个人想法,并没有其他支持。

    SetPass call 和Draw call作为渲染命令队列的组成内容,担负着不同的任务。可以这样理解,SetPass call是告诉GPU接下来要用到哪些资源了,抓紧准备起来,而draw call则是把要求GPU根据顶点数据进行绘制。所以在执行SetPass call时,会向现存中传递大量的资源信息,包括纹理资源也是在这时候加载到缓存中,仅当下一个需要渲染的网格需要变更渲染状态时,才会产生SetPass call。所以,SetPass call和Draw call虽然是相伴产生的,但是两者却不一定对等。在某些情况下,一个batch可能会用到多个pass,比如mesh的反向描边。对于不同的pass,CPU将发送新的SetPass call 和Draw call。而在静态批处理中,因为顶点限制而不能在同一批次处理而被分割的紧邻的多个批次,因为使用的是相同的渲染设置,所以也只会产生一个SetPass call。

    通常来说在优化时我们关注的是DrawCall,但也有不同的声音说,SetPass call更有意义。我觉得用哪个做分析从优化角度来说,差别不大。他们传递的都是指令和地址,真正耗时的是执行绘制阶段。并且两者的产生也基本是相伴的。

    GPU的工作流程:

    顶点着色器:

    顶点着色器负责变换及着色/光照顶点。顶点着色器的输入来自于CPU,CPU输入的每个顶点都会执行一次顶点着色器,顶点着色器本身无法创建和销毁顶点,并且无法得到顶点与顶点之间的关系。正因为这样的独立关系,GPU可以利用自身的特性进行并行运算,所以顶点着色器的运算速度非常快。在此阶段也会进行透视投影、顶点光照、纹理计算、蒙皮。也可以通过修改顶点位置生成程序式动画(procedural animation),例如模拟风吹草动,碧波荡漾。

    几何着色器:

    几何着色器因为在手机端不支持,所以Unity开发程序员也许并不熟悉。几何着色器也是完全可编程的。几何着色器处理以齐次裁剪空间表示的整个图元(三角形,线段,点)。它能够剔除和修改输入的图元,也能生成新的图元。典型应用包括阴影的体积拉伸(shadow volume extrusion)、渲染立方体贴图(cube map)的六个面、在网格的轮廓边拉伸毛发(fur fin)、从点数据生成粒子四边形、动态镶嵌、把线段以分形细分(fractal subdivision)模拟闪电效果、布料模拟等。

    裁剪:

    最常用的裁剪设置是CULL OFF/BACK/FRONT,分别是不剔除/背面剔除/正面剔除。这里的正反面与摄像机没有一分钱的关系,而是通过法线方向决定的。

    屏幕映射:

    这里注意一点,虽然屏幕映射是玩家不可配置和编程的,但是屏幕分辨率确实玩家可以设置的,较小的屏幕分辨率对光栅化阶段是有非常重要的优化效果的。

    三角形遍历:

    三角形遍历阶段把三角形分解为片段(光栅化)。通常每个像素会产生一个片元,除非是使用MSAA,那么每个像素就会产生多个片元。三角形遍历也会对顶点属性进行插值,以生成每个片元的属性,供像素着色器使用。

    片元着色器:

    片元着色器是完全可编程的。其工作是为每个片元着色。片元着色器也能丢弃一些片元,例如根据透明度做剔除。像素着色器可以对多个纹理进行采样并计算逐像素光照和任何会影响片元颜色的计算。此阶段的输入是一组片元属性,这些属性是在三角形遍历阶段通过对顶点属性插值所得。输出则是一个颜色矢量。

    逐片元操作:

    该阶段也称为合并阶段(merge stage)或混合阶段(blending stage),NVIDIA称之为光栅化运算阶段(raster operations stage,ROP)。此阶段不可编程,但是可以高度配置化。最常用的逐片元操作测试包括深度测试ZTest、Alpha测试、模板测试Stencil test,当片元通过了所有测试以后,其颜色就会与帧缓冲原来的颜色进行混合(Blend),混合的方式是可配置的,如Blend One One。在该阶段另一个重要的配置是深度写入ZWrite。

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • Unity 渲染管线

    千次阅读 2020-02-12 10:17:43
    渲染管线1.1 选择一种渲染管线2. 默认管线 Built-in Render Pipeline2.1 渲染通路 Rendering paths2.1.0.1 前向渲染 Forward Rendering2.1.0.2 延迟着色 Deferred Shading2.1.0.3 老版本的延迟着色 Legacy Deferred...

    1. 渲染管线

    Unity中,有多种不同的渲染管线可以选择。简单的说,渲染管线负责从场景中选择物体并渲染到屏幕上,包括三个基本步骤:

    • 裁剪
    • 渲染
    • 后效

    不同的渲染管线有不同的功能和性能特性,分别适应于不同的游戏,应用和平台。

    将项目从一个渲染管线切换到另一个很困难,因为不同渲染管线使用不同的shader进行渲染,而且拥有不同的特性。

    1.1 选择一种渲染管线

    Unity提供了下面的渲染管线:

    • Built-in Render Pipeline 默认渲染管线,是一个通用渲染管线,相对固定,仅可以有限度的进行控制。
    • Universal Render Pipeline (URP) 是可编程渲染管线,可以方便地进行自定义渲染,针对不同的平台进行优化。
    • High Definition Render Pipeline (HDRP) 也是一种可编程渲染管线,可以在高端平台上创建技术领先的,高逼真度的图形渲染。
    • Scriptable Render Pipeline (SRP) 可以基于可编程渲染管线API,创建自定义的渲染管线。你可以从头开始创建一个全新的渲染管线,也可以通过修改URP和HDRP来适应自己的项目。

    2. 默认管线 Built-in Render Pipeline

    默认渲染管线相对于可编程管线,自定义扩展性不高,仅可以通过选择不同的 rendering paths ,并通过command bufferscallbacks 对其功能进行扩展。

    2.1 渲染通路 Rendering paths

    默认管线定义了不同的渲染通路,一个渲染通路是一系列光照和阴影处理。不同的渲染通路的功能和性质特性都不一样,要根据项目特性和目标平台选择合适的渲染通路。

    可以在ProjectSettings>Graphics>Tier Settings种设置不同渲染质量的渲染通路,该设置也可以在摄像机中被覆盖掉。

    如果设置的渲染通路,在硬件设备上不支持,Unity会自动选择低一级的渲染通路。例如,对于不支持延迟着色的硬件,会使用前向渲染。

    2.1.0.1 前向渲染 Forward Rendering

    前向渲染,是默认管线中的默认通路。

    在前向渲染中,实时光照效率非常低。可以通过指定每个像素可以接受的光源数量来调整负载。对场景中其它的光源则会使用逐顶点,或逐对象的高效率,低效果的方式。

    如果你的场景中没有很多的实时光源,或者光照效果没有那么重要,那么选择前向渲染。

    2.1.0.2 延迟着色 Deferred Shading

    延迟着色可以实现更好的光照和阴影渲染效果。

    延迟着色需要GPU的支持,并且有一些限制。不支持半透明物体(这类物体会使用前向渲染),正交投影(这类摄像机使用前向渲染),以及硬件抗锯齿(尽管可以通过后效来实现类似效果)。同时,延迟着色对culling mask不完全支持,而且对 Renderer.receiveShadows 标识按照true(设置无效)来处理。

    如果你的场景有很多的实时光源,需要很高的渲染真实度,并且目标平台硬件支持,则使用延迟着色。

    2.1.0.3 老版本的延迟着色 Legacy Deferred

    Legacy Deferred(light prepass)与Deferred Shading 类似,只是使用了不同的技术,不支持新的PBR standard shader。

    2.1.0.4 老版本的顶点着色 Legacy Vertex Lit

    Legacy Vertex Lit 实现低级效果并且不支持实时阴影,是前向渲染的一部分。基于顶点的光照。

    2.1.0.5 渲染通路比较

    DeferredForwardLegacy DeferredVertex Lit
    Features特性
    逐像素光照(normal maps, light cookies)YesYesYesNo
    实时阴影Yes会有警告?With caveatsYesNo
    反射探针YesYesNoNo
    深度/法线缓冲区Yes需要额外的渲染NoNo
    软边粒子Yes
    半透明对象NoYesNoYes
    抗锯齿NoYesNoYes
    光照裁剪掩码部分支持Yes部分支持
    光照渲染精度逐像素部分逐像素逐像素逐顶点
    性能
    逐像素光照消耗由照亮的像素数决定照亮的像素数*照亮的对象数由照亮的像素数决定
    对象的平均渲染次数1每像素受光照数21
    相对简单场景的消耗中等
    平台支持
    PC(Windows/Mac)Shader Model 3.0+ & MRT(MultiRenderTarget)AllShader Model 3.0+All
    Mobile (iOS/Android)OpenGL ES 3.0 & MRT, Metal (on devices with A8 or later SoC)AllOpenGL ES 2.0All
    ConsolesXB1, PS4AllXB1, PS4, 360All

    2.1.1 前向渲染 Forward rendering path

    前向渲染根据照亮对象的光源的数量,对对象进行一次或多次渲染。光源本身根据其强度等设置,会被进行不同的处理。

    2.1.1.1 实现细节

    前向渲染中,照亮物体,并且一定数量的亮度最高的光源,按照逐像素光照来进行渲染。最多由4个光源按照顶点光照进行渲染。其它的光源,按照球函数(一种特定算法,SH:Spherical Harmonics )计算光照,速度很快但仅仅是一种近似模拟。光源是否被逐像素处理,取决于:

    • 光源的 RenderMode 被设置成 Not Important 的,会被处理成顶点光或球函数模拟光。
    • 最亮的方向光,一定是逐像素光照。
    • Render Mode = Important 的光源是逐像素的。
    • 如果最终对象的逐像素光源数量小于QualitySetting.PixelLightCount设置的值,则会选择更多的光源为逐像素光照,来降低亮度。

    对每个对象的渲染,会执行下面的步骤:

    • Base Pass 来渲染一个逐像素的方向光和所有的逐顶点/SH的光照。
    • 对每个逐像素的光照,额外进行一次渲染。

    例如,对象被一些光源照亮,如下图的圆圈代表的对象,被A-H的8个光源照亮。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVNLRbxQ-1581473824688)(https://docs.unity3d.com/uploads/Main/ForwardLightsExample.png)]

    这里假定所有的光源,拥有想通过的设置,颜色,强度,默认的RenderMode,因此它们对该对象的影响按照A-H的顺序。最亮的光源按照逐像素渲染(A-D,假定设置为每个对象4个逐像素光源),最多4个光源为逐顶点光照(D-G),剩下的用SH渲染(G-H):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASE271PA-1581473824689)(https://docs.unity3d.com/uploads/Main/ForwardLightsClassify.png)]

    注意到光照组之间是重叠的,例如最后一个逐像素的光源同时被混合进了逐顶点光源中,以避免光源或对象的移动导致光照的跳变。

    2.1.1.2 Base Pass

    Base Pass 为每个对象渲染一个逐像素的方向光,所有的逐顶点光源和SH光源。该过程同时会在Shader中处理光照贴图(lightmaps),环境光,自发光。该过程中处理的方向光可以渲染阴影。注意,LightMaps对象不会再渲染SH光照。

    注意,如果Shader中设置了 “Only Directional Light” pass 标识,则该Pass仅渲染主方向光,环境/光照探针和光照贴图(SH和逐顶点光照将不在该Pass中渲染)。

    2.1.1.3 Additional Pass

    Additional Pass 负责渲染影响到对象的一盏光源的逐像素光照。这些pass不会渲染阴影(也就是说前向渲染,仅支持一个带阴影的方向光),除非添加了multi_compile_fwdadd_fullshadows 声明。

    2.1.1.4 效率 Performance Considerations

    Spherical Harmonics光照拥有非常快的效率,CPU占用很小,GPU负载也非常低(base pass总是会计算SH;同时由于其工作原理,SH光源数量的增加,几乎不会增加性能损失)。(SH没有深入研究,所以先按照字面意思解释这部分吧)

    SH光照的缺点:

    • 它们是逐顶点计算的,所以不支持light cookies(简单理解为镂空的灯笼效果,应一张贴图部分遮挡光源)和lightmaps。
    • SH光照将以一个比较低的频率执行。SH光照不会产生强烈的光照过度,它们只会影响漫反射(diffuse)光照(对高光来说频率太低了)。
    • SH光照算法,在光源离表面很近时,渲染效果可能不太正常。

    (译者)以前自研引擎也曾经实现过一种效率很高,但是效果不太好的点光源:

    • 在CPU中计算光照位置,颜色,强度,衰减。这些可以根据参数实时变化,模拟摇曳的灯光等效果。
    • 渲染一个物体时,将照亮该物体的该类光源的参数传给shader
    • 在vertex shader中,按照顶尖距离这些光源的距离,和光源自身的参数,计算该顶点受这些光源的影响,并混合,叠加到顶点颜色中(或者其它的VertexOutput的字段)
    • 在pixel shader中,处理diffuse时混合上面计算的颜色。

    感觉跟SH有点像,基于球形的衰减照亮顶点。

    2.1.2 延迟着色 Deferred Shading rendering path

    延迟着色的技术原理,可以参考Wikipedia: deferred shading

    2.1.2.1 概述

    使用延迟着色时,每个对象能够接收的点光源数量没有限制,所有的光源都将按照逐像素渲染,意味着都能跟光照贴图正确地配合,以及支持cookies和阴影。

    延迟着色地优势是负载跟照亮一个像素的光源数量是成比例的。该负载只跟光源在场景中的体积(照亮范围)有关,而跟它照亮的对象数量无关。因此提升效率的方法之一,就是让光源的照亮范围小一些。延迟着色具有一致性,可以按照我们预想的进行渲染。每个光源都是逐像素的,因此再比较大的三角形上形成颜色块(基于顶点的光照因为只计算了顶点颜色,并再像素阶段进行插值而导致一些色阶)。

    延迟着色的缺点是不支持抗锯齿和半透明物体(这些物体将在前向渲染中处理)。同时不支持对特定对象是否接受阴影的设置,并且culling mask也仅是有限度的支持:最多支持4个culling masks,也就是说culling layer mask 至少要包含所有layers减去4个layers,32-4=28个layers是设置的。

    2.1.2.2 需求

    需要显卡支持Multi Render Target,Shader Mode 3.0+,Depth render texture。2006年以后的PC显卡,从GeForce8XXX以及RadeonX2400,IntelG45开始,都支持。

    在移动端,需要OpenGL ES 3.0。

    注意:延迟着色不支持正交投影,如果摄像机是用正交模式渲染,则会对其启用前向渲染通路。

    2.1.2.3 效率

    延迟着色中光照负载,只跟照亮像素的光源数量有关,而跟场景复杂度无关。所以将点光源或聚光灯光源的范围降低可以降低负载。如果光源整体或部分被场景对象遮挡,则效率更高(照亮的范围更小)。

    如果光源需要渲染阴影,则极大的增加负载。对于每个要投射阴影的对象,每个光源都要进行额外的渲染。同时,渲染阴影的光源,在shader代码效率上也远低于不渲染阴影的shader。

    2.1.2.4 实现细节

    如果对象不支持延迟着色(比如半透明),则它们将在延迟渲染过程完成后,在前向渲染通路中完成。

    G-Buffer(Geometry buffer)对RT0-RT4(render target)的使用如下,数据被渲染到每个render target 的不同通道中:

    • RT0, ARGB32 : Diffuse color 漫反射颜色 (RGB), occlusion(A).
    • RT1, ARGB32 : Specular color 高光颜色 (RGB), roughness 粗糙度(A).
    • RT2, ARGB2101010 : World space normal 世界空间法线 (RGB), unused(A).
    • RT3, ARGB2101010(non-HDR) 或 ARGBHalf(HDR) : Emission + lighting + lightmaps + reflection probes
    • Depth + Stencil buffer 深度+模板缓冲区

    因此,默认的人G-Buffer是每个像素160位(non-HDR)或192位(HDR)。

    如果使用了 ShadowmaskDistance Shadowmask 进行混合渲染,则会用到RT4:

    • RT4, ARGB32 : Light occlusion values(RGBA) 光照遮挡值.

    这时,G-Buffer则是每个像素192位(non-HDR)或224位(HDR)。

    如果硬件不支持5个并行的render target,则使用了shadow masks 的对象,将会由前向渲染管线来渲染。当摄像机未开启HDR时,Emission+lighting buffer (RT3)使用对数编码方式,来提供比普通的ARGB32贴图格式更大的动态范围。

    注意,当摄像机使用HDR渲染时,并不会为Emission+lighting buffer (RT3)单独创建render target,而是将RT3创建为ARGBHalf,每个通道是16位,这样用同一个RT存储。

    (Note that when the Camera is using HDR rendering, there’s no separate rendertarget being created for Emission+lighting buffer (RT3); instead the rendertarget that the Camera renders into (that is, the one that is passed to the image effects) is used as RT3.)

    G-Buffer Pass

    G-Buffer位每个对象渲染一次,将包括漫反射和高光颜色,表面平滑度,世界空间法线,以及emission+ambient+reflections+lightmaps渲染到G-Buffer中。G-Buffer被创建成一个全局的属性,这样后面的shader可以访问(命名为CameraGBufferTexture0 … CameraGBufferTexture3)。

    Lighting Pass

    lighting pass 基于G-Buffer和深度在屏幕空间计算光照,因此负载跟场景复杂度无关,光照被累加仅emission buffer。

    与摄像机的近裁剪面不相交的点光源和聚光灯光源(完全在摄像机近裁剪面的前面),利用场景的Z-buffer测试,进行3D渲染。这样可以将被遮挡的光源过滤掉,提升性能,即对光源进行深度测试,失败了就不进行光照运算了。而对于与近平面相交的方向光,点光/聚光等光源,则渲染成四方形面片。

    如果开启了阴影,则也在该阶段处理。但是这需要对投射阴影的对象额外渲染,并在该阶段使用更加复杂的shader。

    在该渲染管线中,仅可以使用Standard光照模型。如果需要不同的光照模型,则修改lighting pass用的shader,通过将 Built-in shaders 里的Internal-DeferredShading.shader的文件,放到Assets/Resources目录下,并进行修改。然后,在ProjectSettings>Graphics,将Deferred下拉列表,改为Custom Shader,并指定我们改好的shader。

    2.1.3 老版延迟着色 Legacy Deferred rendering path

    关于改着色技术理论,参考 this article

    老版本的延迟着色,是为了兼容Unity5.0版本,主要是因为该版本不支持一些渲染特性(比如standard shader,reflection probes)。新项目不建议再使用该版本管线。

    注意:延迟着色不支持正交投影,如果摄像机是正交视图的,则会使用前向通路渲染。

    2.1.3.1 概述

    使用延迟着色时,每个对象能够接收的点光源数量没有限制,所有的光源都将按照逐像素渲染,意味着都能跟光照贴图正确地配合,以及支持cookies和阴影。

    延迟着色地优势是负载跟照亮一个像素的光源数量是成比例的。该负载只跟光源在场景中的体积(照亮范围)有关,而跟它照亮的对象数量无关。因此提升效率的方法之一,就是让光源的照亮范围小一些。延迟着色具有一致性,可以按照我们预想的进行渲染。每个光源都是逐像素的,因此再比较大的三角形上形成颜色块(基于顶点的光照因为只计算了顶点颜色,并再像素阶段进行插值而导致一些色阶)。

    延迟着色的缺点是不支持抗锯齿和半透明物体(这些物体将在前向渲染中处理)。同时不支持对特定对象是否接受阴影的设置,并且culling mask也仅是有限度的支持:最多支持4个culling masks,也就是说culling layer mask 至少要包含所有layers减去4个layers,32-4=28个layers是设置的。

    2.1.3.2 需求

    需要显卡支持Shade Mode 3.0+,Depth render texture,双面stencil buffers。2004年以后的PC显卡,GeForce FX,Radeon X1300,以及Intel 965/GMA X3100 以后的显卡,都支持。

    2.1.3.3 效率

    延迟着色中光照负载,只跟照亮像素的光源数量有关,而跟场景复杂度无关。所以将点光源或聚光灯光源的范围降低可以降低负载。如果光源整体或部分被场景对象遮挡,则效率更高(照亮的范围更小)。

    如果光源需要渲染阴影,则极大的增加负载。对于每个要投射阴影的对象,每个光源都要进行额外的渲染。同时,渲染阴影的光源,在shader代码效率上也远低于不渲染阴影的shader。

    2.1.3.4 实现细节

    Base Pass

    base pass 对每个对象渲染一次,摄像机空间的法线和高光强度,被渲染到一张ARGB32的Render Texture
    上(法线存储在RBG通道,高管强度存储在A通道)。如果平台或硬件支持将Z-buffer当贴图进行访问,则可以不用渲染深度,否则需要一个额外的渲染通路用shader replacement来渲染深度。

    Base Pass主要是根据场景填充Z-buffer,以及存储像素的法线和高光强度的Render Texture。

    Lighting Pass

    lighting pass 基于深度,法线,高光强度来计算光照。因为计算是在屏幕空间的,所以效率跟场景复杂度没有关系。光照图是一张ARGB32(32位)的render texture,RGB通道用来存储漫反射颜色,A通道存储单色的高光强度。光照计算的值经过对数编码,以达到更大的动态范围。如果摄像机打开了HDR,则缓冲区改用ARGBHalf(64位),也不会执行对数编码了。

    对于点光/聚光灯光源,与摄像机近平面不相交(完全在视锥体内)的,渲染成3D形状(考虑球形),同时进行深度测试,如果像素深度小于光源深度,则受该光源影响。对于与近平面相交的光源(可能光源的位置在摄像机近平面的后面),同样也会渲染3D形状,但是深度测试相反,大于光源深度的像素,受该光源影响。这样部分或全部被遮挡的光源,渲染效率就特别高了。如果一个光源同事与近平面和远平面相交,前面提到的优化就不会被执行了,不会执行深度测试,光照会被渲染成一个面片。

    方向光不会执行上述优化,而是全屏计算。

    如果光源开启了阴影,则也在该阶段处理。但是这需要对投射阴影的对象额外渲染,并在该阶段使用更加复杂的shader。

    该通路下,只能使用Blinn-Phong光照模型,如果需要不同的光照模型,则修改lighting pass用的shader,通过将 Built-in shaders 里的Internal-PrePassLighting.shader的文件,放到Assets/Resources目录下,并进行修改。然后,在ProjectSettings>Graphics,将Lagacy Deferred下拉列表,改为Custom Shader,并指定我们改好的shader。

    Final Pass

    Final Pass 生成最终渲染图像,在这一步中,所有的对象需要再渲染一边,并利用光照图获取光照信息,合并贴图颜色,及其它自发光光照。LightMaps也是再这一步中进行应用。距离摄像机近的,渲染实时光照,并叠加烘焙的方向光光照。距离摄像机远的,过渡到完全的烘焙光照。

    2.1.4 顶点光照渲染 Vertex Lit Rendering Path

    该通路对没个对象渲染一次,并在顶点阶段,对每个顶点执行所有的光源的光照运算。

    该方式速度最快,同时绝大多数的显卡都支持。

    因为所有的光照都是在顶点中完成的,该通路不支持很多逐像素渲染的特性,比如:阴影,法线贴图,light cookies,高细节的镜面高光都不支持。

    2.2 内建渲染管线的硬件需求Hardware Requirements for the Built-in Render Pipeline

    2.2.1 概要

    Win/Mac/LinuxiOS/AndroidConsoles
    Deferred lightingSM3.0, GPU support-Yes
    Forward renderingYesYesYes
    Vertex Lit renderingYesYes-
    Realtime ShadowsGPU supportGPU supportYes
    Image EffectsYesYesYes
    Programmable ShadersYesYesYes
    Fixed Function ShadersYesYes-

    2.2.2实时阴影 Realtime Shadows

    实时阴影在大多数的PC,手机,主机平台上都支持。在Windows系统上(Direct3D API),显卡都要支持阴影映射;多数2003年后的独立显卡,以及2007年以后的集成显卡都支持。技术上,支持Direct3D9的显卡,都要支持D16/D24X8 or DF16/DF24 贴图格式。在OpenGL上,还要支持GL_ARB_depth_texture。

    移动端阴影(iOS/Android)需要OpenGL ES 2.0 以及 GL_OES_depth_texture格式扩展,或者支持OpenGL ES 3.0。因为贴图扩展格式在Tegra3,4上不支持,所以在这些硬件上,也不支持阴影。

    2.2.3 后处理效果 Post-processing Effects

    Post-processing effects 后处理效果,需要render-to-texture功能(向一种特殊的贴图上渲染),目前显卡都是支持的。

    2.2.4 Shaders

    可以编写可编程shader或固定功能shader(这里指的是Unity shader,固定管线没有shader)。在Shader Mode2.0(PC)以后和OpenGL ES 2.0(移动端)以后,都支持可编程shader。如果需要更多的功能,可以选择更高的shader models。固定功能渲染除了主机,所有平台都支持。

    3. 通用渲染管线 Universal Render Pipeline

    Universal Render Pipeline (URP),通用渲染管线是预建的一种可编程渲染管线,URP提供了一种易于美术使用的工作流,快速容易地创建优化地多平台地图形,从移动端,到高端主机,到PC。

    更详细地URP,参考URP package documentation microsite

    4. 高级渲染管线 High Definition Render Pipeline

    HDRP让你可以位高端主机平台创建技术领先地,高逼真度地图形。

    用HDRP创建AAA级地游戏,汽车演示,建筑应用,以及其它需要高逼真度地图形。HDRP使用基于物理地渲染和材质(PBR),支持前向和延迟着色。HDRP使用了compute shader 技术因此需要硬件支持。

    参考:HDRP package documentation microsite

    5. 可编程渲染管线 Scriptable Render Pipeline

    Scriptable Render Pipline允许在C#脚本中控制渲染,进行各种高级地定制。

    Unity提供了2中于定义地SRC,分别是URP和HDRP,这两种都提供了大量定制选项。如果需要对渲染进行更多地控制,可以从头开始写一个全新的SRP。

    可以从头开始创建全新的SRP,也可同通过修改URP和HDRP来满足需求。

    更多信息参考SRP Core package documentation microsite.

    5.1 SRP Batcher 合批

    SRP Batcher,是针对场景里,使用同一个shader的变体的许多materials的对象进行处理,以提升CPU渲染效率的。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lY5ZLGFO-1581473824690)(https://docs.unity3d.com/uploads/Main/SRPBatcher.png)]

    5.1.1开启SRP合批

    只有使用SRP的项目,才能开启SRP Batcher,包括:URP,HDRP,自定义SRP。

    位URP,HDRP开启Batcher:

    1. 在Project窗口,找到UniversalRP-High/Low/MediumQuality.asset并选中。
    2. 在Inspector窗口,在Advanced部分,勾选开启,如下图。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dPbMy3G5-1581473824690)(https://docs.unity3d.com/uploads/Main/SRPBatcher_Asset.png)]

    也可以在代码中修改:

    GraphicsSettings.useScriptableRenderPiplineBatching = true;
    

    如果是XR项目:

    XRSettings.stereoRenderingMode = XRSettings.StereoRenderingMode.SinglePassInstanced;
    

    5.1.2 各个平台,支持合批的Unity版本:

    PlatformMinimum Unity version required
    Windows DirectX 112018.2
    PlayStation 42018.2
    Vulkan2018.3
    OSX Metal2018.3
    iOS Metal2018.3
    Nintendo Switch2018.3
    Xbox One DirectX 112019.2
    OpenGL 4.2 and higher2019.1
    OpenGL ES 3.1 and higher2019.1
    Xbox One DirectX 122019.1
    Windows DirectX 122019.1

    5.1.3 SRP Batcher 工作原理

    在Unity中,可以在任何时候修改任何材质的属性,但这回导致效率损失。例如,DrawCall在使用一个新的材质时,需要做做很多初始化工作。所以场景中的材质越多,CPU需要花费更多的时间位GPU准备数据。传统的方法时通多降低Draw Call调用次数,来降低这方面的CPU消耗。因为真正导致效率问题的,是位调用DrawCall做的准备工作,而DrawCall本身相对较少,主要是向GPU指令缓存提交数据。

    SRP Batcher通过将一系列的Bind和Draw的指令合并到一起,降低设置GPU产生的负载,如下图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n6hhQ3QZ-1581473824691)(https://docs.unity3d.com/uploads/Main/SROShaderPass.png)]

    如上图,左边是标准的一次DrawCall,需要做的准备工作,远高于右边的一次DrawCall。

    (译者:在自研引擎时,对于GPU的指令也是有缓存的,通过在内存中缓存,每次设置GPU状态时,判断是否改变,如果没有改变,就不设置了,比如Driect3D.SetRenderState(…)。这种缓存是分层的,底层是GPU API级别,如SetRenderState,SetTexture,SetShader,等。上层是材质级别,材质级别需要对渲染对象进行材质排序。细节实际上很复杂,这里只是提一下概念原理。)

    为了达到最大的渲染效率,合批越大越好。位了能将更多的渲染合到一个批次,要尽量使用相同的shader建立不同的material,减少shader变体的数量。

    在内部的渲染循环中,当Unity发现一个新的材质,CPU会收集所有的需要设置到GPU的属性,调用GPU API 在GPU现存中建立常量缓冲区。GPU Buffer的数量,取决于Shader如何声明自己的CBUFFERs。

    位了提升使用了较少的shader变体创建了很多材质使用的场景,SRP在CPU对GPU数据状态进行了缓存。

    SRP Batcher 是一个底层的渲染循环,作用是减少对GPU 显存的修改次数。如果材质没有发生改变,则不会设置和更行GPU现存内容。SRP建立了专门的代码流程,来快速的在一个大的GPU Buffer中更新引擎各种属性,如下图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lDzUqOTb-1581473824692)(https://docs.unity3d.com/uploads/Main/SRP_Batcher_loop.png)]

    这里,CPU只处理Unity引擎定义的属性,上图中的Per Object large buffer。所有的材质,都在GPU中有固定的CBUFFER,随时可以使用。这对渲染提速在于:所有的材质内容都保留在了显存中,有专门的逻辑来为每个对象属性管理per-object GPU CBUFFER。

    (译者:从该篇幅可以看出,主要还是一种缓存机制,但是能将缓存在内存和显存中进行更加有效的映射,同时所有的材质都在显存中缓存了,很多GPU API 调用都可以省掉了。具体原理,还是只能理解个大概)

    5.1.4 SRP Batcher 的兼容性

    SRP渲染的Object需要:

    • 必须是Mesh或Skinned Mesh,不能是粒子。
    • Shader必须兼容SRP Batcher,HDRP和URP的Lit,Unlit都兼容(除了粒子版本)。

    Shader 兼容性:

    • 需要在名字为“UnityPerDraw”的CBUFFER中声明引擎内建的属性。例如,unity_ObjectToWorld, or unity_SHAr
    • 需要在名字为“UnityPerMaterial”的CBUFFER中声明材质属性。

    可以在Shader Inspector 面板中查看兼容性:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JaQJE6v4-1581473824692)(https://docs.unity3d.com/uploads/Main/SRP_batcher_shader_compatibility.png)]

    Unity会自动识别兼容SRP Batcher的对象,在SRP Batcher 逻辑路径渲染,非兼容对象也会被Standard SRP 逻辑路径渲染。

    Using the SRP Batcher code pathNot using the SRP Batcher code path
    * 使用兼容SRP Batcher 的Sahder的Mesh* 不是mesh的(包括skinned mesh)
    * Shader不兼容的
    * 使用了 Material Property Block 进行渲染的

    5.1.5 SRP Batcher 性能剖析

    为了验证SRP Batcher 对渲染性能的提升,可以向场景中添加 SRPBatcherProfiler.cs 脚本(创建一个空对象,添加脚本),来查看。当该脚本运行时,使用F8键显示/隐藏剖析窗口,F9键开启/停止Batcher。

    界面显示如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJbXRf7K-1581473824692)(https://docs.unity3d.com/uploads/Main/SRP_Batcher_overlay.png)]

    该系统统计了SRP渲染的CPU时间占用。

    这里的时间累计了一帧的所有的RenderLoop.Draw and Shadows.Draw的时间,无论在哪个线程。例如SRP占用了1.31ms,可以是在主线程draw call占用了0.31ms,1ms是在graphic jobs执行占用的。

    显示信息

    名字描述
    (SRP batcher ON) / (SRP batcher OFF)当前Batcher是否工作。F9键开启/关闭
    CPU Rendering timeSRP循环占用的总CPU时间,无论使用的哪种线程模型,例如single(单线程), client/worker(多线程) or graphics jobs(Job系统)。根据该参数可以看到Batcher的效果,通过F9开启/关闭Batcher来对比该CPU时间,来进行对比。上图例子中是2.11ms。(incl RT idle):表示渲染线程的空闲时间,这意味着是client/worker模式,而没有graphics jobs,渲染线程需要等待主线程的Graphics Commands。该例子中,渲染线程等待了0.36ms。
    - SRP Batcher code path (flushes)b标识了SRP Batcher 逻辑占用的CPU时间。该时间被分成了渲染所有对象(1.18ms),和渲染对象阴影(0.13ms)的时间。如果阴影数量比较多,尝试降低场景中投射阴影的光源的数量,或者将SRP Asset配置中的Cascades参数降低。该例中,是1.31ms。
    flush(s)数量标识了根据shader变体,场景被flush了几次(渲染了多少批次),这里是89次。该值越低越好,越低标识该帧中用到的shader变体越少。
    - Standard code path (flushes)标识了SRP非Batcher逻辑占用的CPU时间。例如骨骼动画模型和粒子。在该例子中,渲染了81个对象,消耗0.8ms,其中影子0.71ms,其它的0.09ms。
    Global Main Loop: (FPS)主循环时间,等于FPS时间。注意:FPS并不是线性的,如果看到FPS提升了20,并不意味着效率提升了。按F9开启/关闭SRP Batcher,对比CPU Rendering time

    5.1.6 Unity Frame Debugger 中的SRP Batcher 数据

    可以在Frame Debugger窗口中查看SRP Batcher的合批情况。

    1. Window > Analysis > Frame Debugger ,左侧列表中,Render Camera > Render Opaques,展开 RenderLoopNewBatcher.Draw 列表,查看合批次数。
    2. 点击任意的 SRP Batch 查看其状态。

    SRP Batch 细节显示了调用了多少次DrawCall,Shader附加的关键字,为什么没有于上个批次合到一起。在下面的例子中,原因是:Node use different shader keywords,即该批次使用了与上个批次不同的shader keywords,因为使用了不同的shader变体,合批被打断了。如果SRP的DrawCall次数较低,说明很可能用到了太多的shader变体。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-foI634iK-1581473824693)(https://docs.unity3d.com/uploads/Main/SRP_Batcher_batch_information.png)]

    如果要实现自己的SRP,而不使用URP或HDRP,尝试写一个使用最少的shader keywords的通用的’uber’ shader (但是可以根据需要使用材质参数和属性,没有太大限制)。

    展开全文
  • Unity渲染管线详解

    千次阅读 2021-01-19 14:35:16
    1.UnityBuild-in渲染管线 当双摄像机的时候,注意Camera中的Clear Flags 和 Depth。 其中Clear Flags在摄像机在渲染时,会进行清屏的操作。选择skybox是除了天空盒都会被清除。 Depth数值越小越先被渲染。 ...

    1.UnityBuild-in渲染管线

    当双摄像机的时候,注意Camera中的Clear Flags 和 Depth。

    其中Clear Flags在摄像机在渲染时,会进行清屏的操作。选择skybox是除了天空盒都会被清除。

    Depth数值越小越先被渲染。

    层级剔除:culing mask选择被剔除的层级

    2.渲染队列

    RenderQueue 越小越先被渲染。

    不透明队列(RenderQueue < 2500) RenderQueue相同,按摄像机从前到后渲染。

    半透明队列(RenderQueue > 2500) RenderQueue相同,按摄像机从后到前渲染。

    3.CPU打包数据传GPU

    SetPass Call:设置渲染状态(让GPU知道使用哪个shader,混合模式,背面剔除等)

    Draw Call:让GPU知道使用哪个模型数据

    顶点shader最基本要完成:将顶点坐标转换到裁剪空间(2x2x1的长方体cvv),投影成像。

    片段shader:输出颜色值

    GPU阶段:

    背面剔除阶段:三角形的索引顺序是顺时针就是背面。逆时针是正面。

    4.片元shader

    纹理技术

      1.纹理采样,纹理在计算机中就是数组的形式。eg:(纹理坐标u,v) = (0.5,0.5),那对应32x32的纹理就是:x = 32 * 0.5,y = 32*0.5(真实不是这样,简单这样理解)。纹理坐标是在建模软件中展uv得到。

    当x = 0.4*32时就是12.8 如果采用4舍5入就可能会产生失真(明显锯齿状)解决看下方纹理过滤机制。

      2.纹理过滤机制:在Unity中Point就是4舍5入的方式,双线性插值,三线性插值。

        3.Mipmap:勾选即可Generate Mip Maps就可。

       4.纹理寻址模式

       5.纹理压缩格式

    光照计算

    光照分析:直接光漫反射(eg:phong光照模型)+直接光镜面反射(eg:GGX高光方程)+间接光漫反射(eg:球谐SH)+间接光镜面反射(eg:反射球,ibl技术)+More(更多的光照技术eg:环境遮挡AO,SSR屏幕空间反射,SSS次表面散射)。

     

    5.输出合并

    处理遮挡关系,处理半透明混合。Unity中有Z-Buffer和color-Buffer,Zwrite关闭了深度写入的物体不会被写入到Z-buffer中,但会被写入到color-Buffer中。

    提前深度测试:Early-Z,在顶点着色器后发生。(是否支持与硬件有关)

    混合:从后到前,关闭Zwrite。控制公式:

     

     

    展开全文
  • Unity渲染顺序解析

    2020-09-11 16:27:57
    Unity渲染顺序Unity引擎中影响渲染顺序的因素有:Camera Depth透明、不透明物体分隔同一个相机下Sorting LayerOrder In LayerRenderQueue深度排序。按照包围盒的深度进行排序深度补间其他排序手段Unity2018后: ...
  • Unity3d 离线渲染插件

    2019-01-16 18:00:15
    Unity3d 离线渲染,Octane for Unity3d,Unity3d烘焙,Unity3d VR制作
  • Unity渲染顺序

    千次阅读 2018-03-22 16:48:29
    影响渲染顺序的因素有:1.Camera Depth两个Camera进行渲染时,Depth值越大,那么渲染的物体就会在更上面。2. Z值同一个camera下,如果两个物体的shader的深度写入(ZWrite On)和深度比较(ZTest)都是开启的,那么距离...
  • Unity 渲染概念

    2019-08-24 20:32:06
    物体对象的组成 所有的物体都是有【三角形网格】组成,越光滑的面,用到的三角形越多。 三角形越多,物体越精细,但运算量也越大 ...对每个三角形网格使用图片渲染,从而达到对物体的渲染 ...
  • unity 渲染层级详解

    千次阅读 2019-02-25 14:08:39
    Camera是unity中最优先的渲染顺序控制。depth越大,渲染顺序越靠后。  2、Sorting Layer 在Tags &amp; Layers设置中可见 3、Order In Layer 相对于Sorting Layer的子排序,用这个值做比较时只有都在同一...
  • DabrovicSponza:尝试使用Unity渲染“ Dabrovic Sponza”场景
  • Unity渲染层级关系

    千次阅读 2018-01-24 11:35:33
    一、条件:Render Mode都是Screen Space-Camera时的渲染顺序 1.遵循刷油漆规则 2.依次由Render Camera的Depth值、Sorting Layer先后顺序、Order in Layer值决定 Render Camera不同时,由Render Camera的...
  • Unity 渲染调试工具 renderDoc,安装成unity插件,通过unity直接调用, 查询渲染状态, 帮助优化渲染性能, 方便快捷。
  • 本插件为自制插件,方便快捷,类似AE的序列帧格式输出设置,可以将附着脚本的相机画面渲染出序列帧,同时提供帧数设置,文件夹选择,渲染图片大小设置,渲染中停止功能。
  • Unity渲染优化(UI向)

    千次阅读 2018-05-18 21:05:21
    l 该译文旨在帮助客户端程序和美术了解unity的基本渲染流程以及一些优化思想,可以避免将来绕弯路。l 译文会跳过不必要的内容,力求精简,不懂之处可以询问。l 碍于水平问题,不足或错误之处请指出。优化图形渲染...
  • unity渲染先后顺序

    千次阅读 2017-09-05 08:31:58
     Unity中的渲染顺序自上而下大致分为三层。 最高层为Camera层,可以在Camera的depth那里设置,设置之后,图形的渲染顺序就是先绘制depth低的相机下的物体,再绘制depth高的相机下的物体,也就是说,depth高的相机会...
  • unity渲染路径基本概念

    千次阅读 2018-04-06 00:13:44
    unity提供了多个内置的渲染路径,他们是根据Graphics Settings 或者Camera的设置,Camera可以覆盖Graphics Settings 这里我主要介绍 Forward Rendering Path Deferred rendering path 选择那个主要根据灯光的...
  • unity渲染完成之后会调用这个函数,source是unity经过前面一步一步渲染之后得到的图片,我们可以在这个函数里做一些自定义处理,最后unity会把结果输出到dest,作为游戏最终显示的画面。 unity后处理有很多资料...
  • unity渲染顺序

    千次阅读 2018-07-19 16:30:42
    今天美术做了一个UI特效,在UI里面发现怎么也看不见该特效,不管Sorting Layer 以及Order In Layer 都没有问题。经过排查原来是美术把材质球的RenderQueue设置错误...Camera Depth小的一定先进渲染管线。 2.Sort...
  • 关于Unity渲染优化,你可能遇到这些问题汇总
  • Unity渲染基础——Mesh原理

    千次阅读 2019-11-24 16:07:13
    这片文章其实是综合了我之前看过的几篇文章,然后汇总了一下。... Unity中想要显示一个3D模式,必须要知道该模式的形状,这个形状其实就是mesh数据。有了mesh数据后,再通过Mesh Filter组件将mesh...
  • Unity渲染学习:简易SRP实现 原文:https://zhuanlan.zhihu.com/p/36407658 c#部分: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using ...
  • 原文地址(推荐其系列文章):Unity渲染教程(十九):图形处理器的实例化技术 译者:崔嘉艺(milan21) 审校:王磊(未来的未来) 渲染一大堆的球体。 添加对图形处理器实例化技术的支持。 使用...
  • 使用屏幕外渲染目标在Unity中实现门户效果的超小示例。 信息 请参阅此随附的博客文章 ,以获取有关所涉及技术的说明。 更新(2020/07 / 22,23):升级了Unity项目,改进了台式机的摄像头,修复了Teleport.cs的小...
  • Unity渲染模型顶点色shader教程

    千次阅读 2019-06-08 20:52:24
    首先用Maya打开已经做好的模型,需要提前安装好...打开渲染设置,取消最下方的Enable Default Light。 打开材质选项,把Ambient Color调至最高,模拟一个全局照明的效果。 烘培之前给物体做一个备份,复制一个新...
  • Unity 渲染管道流程

    千次阅读 2019-01-30 18:55:19
    Mark、
  • Unity 2018 渐进式光照系统可能引起的闪退 很多电脑在升级显卡驱动后,unity高版本,GPU预渲染功能失效,一直丢失渲染信息,无法读条的问题,经过阅读国外帖子,终于解决,鉴于国内网站并无此类信息,特发此文
  • Unity渲染路径(Rendering Paths)

    千次阅读 2017-08-29 20:38:49
    Rendering PathsUnity支持不同的Rendering Paths(渲染路径)。您应该根据游戏内容和目标平台/硬件来选择。不同的渲染路径有不同的表现特点,这主要影响光照和...如果一个显卡不支持选择的渲染路径,Unity将会自动选
  • Unity渲染引擎一般都会先对物体进行排序,再渲染。常用的方法是: (1)先渲染所有不透明物体,并开启它们的深度测试和深度写入。 (2)把半透明物体按它们距离摄像机的远近进行排序,然后按照从后往前的顺序渲染这些...
  • Unity渲染各种注意事项

    千次阅读 2019-06-18 23:37:06
    由于DX平台与OpenGL平台的差异性,unity使用了GL类来进行两者的统一,同样使用该库来进行统一的渲染,因此我们可以使用该库来获取shader中VP矩阵: Matrix4x4 projectionMatrix = GL.GetGPUProjectionMatrix...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,347
精华内容 14,538
关键字:

unity渲染