当前位置: 首页 > article >正文

UnityShader学习笔记——渲染路径

——内容源自唐老狮的shader课程

目录

1.是什么

2.LightMode标签

3.前向渲染路径(Forward)

3.1.处理光照的方式

3.2.处理各种光源的方式

3.3.在哪里进行光照计算

4.顶点照明渲染路径(Vertex)

5.延迟渲染路径(Deferred)

5.1.处理光照的方式

5.2.在哪里进行光照计算

5.3.内置光照变量

6.对比

6.1.光源的渲染

6.2.Pass

6.3.优缺点

7.如有疏漏,还请指出


1.是什么

        其决定了光照如何应用到Unity Shader中,不同渲染路径获取光源数据的流程不同。因此若想要获取正确的光照,就需要对每个Pass设置其对应的渲染路径。


2.LightMode标签

        LightMode渲染标签是用来指明该Pass匹配的渲染路径是哪种的,它通常需要和Camera中的Rendering Path匹配,用于指定Pass在渲染过程中的哪个阶段

        LightMode的值有如下几种:

        Always:不管使用哪种渲染路径,该Pass始终渲染,但不会计算任何光照

        ForwardBase:前向渲染路径的基础照明阶段执行的Pass,它会计算环境光,重要的平行光,逐顶点/SH光源和Lightamps

        ForwardAdd:前向渲染路径的额外照明阶段执行的Pass,它会计算额外的逐像素光源,每个Pass对应一个光源

        Deferred:延迟渲染路径中执行的Pass,用于几何阶段之后执行光照计算,该Pass会渲染到G缓存(G-buffer)中

        ShadowCaster:用于生成阴影图的Pass,通常用于阴影投射,把物体的深度信息渲染到阴影纹理或一张深度纹理中

        MotionVectors:用于生成运动矢量的Pass,通常用于动态模糊

        Meta:用于在渲染对象元数据时执行的Pass


3.前向渲染路径(Forward)

3.1.处理光照的方式

        主要有三种:

        逐像素处理:需要高等质量的光

        逐顶点处理:需要中等质量的光

        球谐函数(SH)处理:需要低等质量的光。它会将光照场景投影到球谐函数的空间中,通过一系列球谐函数来表示光照。用内存换性能,细节表现效果差

3.2.处理各种光源的方式

        在前向渲染中,一部分最亮的灯光以逐像素处理,然后4个点光源以逐顶点方式处理,其余灯光以SH处理。而一个光源究竟是什么处理取决于以下几点:

        (1)渲染模式设置为Not Important的光源始终以逐顶点或者SH的方式渲染

        (2)渲染模式设置为Important的光源始终以逐像素渲染

        (3)最亮的平行光总是逐像素渲染(当太阳使)

        (4)如果逐像素光照的灯光数量小于项目质量设置中的Pixel Light Count(像素灯光计数)的数量,那么其余比较亮的灯光将会被逐像素渲染 (超过4个可能会被丢弃)

        (5)如果灯光渲染模式为Auto,Unity会根据灯光亮度以及物体的距离自动判断其重要性

        unity一般还会将不同灯光组之间重叠,即同一个光源以多种方式处理。以解决不同渲染模式的光源衔接时会出现瑕疵的问题

3.3.在哪里进行光照计算

        Pass通道中,有两种Pass可以来进行前向光照渲染的光照处理

        Base Pass(基础光照通道,对应LightMode为ForwardBase)

        它是渲染物体的主要通道,用于处理主要的光照效果,主要用于计算逐像素的平行光和所有逐顶点以及SH光源。可以有多个

        默认支持阴影

        可用来实现漫反射,高光反射,自发光,阴影,光照纹理等

        Additional Pass(附加渲染通道,对应LightMode为ForwardAdd,混合一般为one one)

        是渲染物体额外的光照通道,用于处理一些附加的关照效果,主要用于计算所有除了平行光以外影响该物体的逐像素光源,每个光源都会执行一次该Pass

        它默认不支持阴影,需要添加 #pragma multi_compile_fwdadd_fullshadows 来开启阴影

        可用来实现描边,轮廓,辉光等

        

        对于一个物体,一个Base Pass只会执行一次,但Additional Pass会根据影响该物体的其他逐像素光源而被多次调用。且每个逐像素光源都会调用一次Addtional Pass

        虽然但是,具体处理光照的方式还是我们自己来搞的


4.顶点照明渲染路径(Vertex)

        在Pass里将LightMode设置为Vertex即可。通常只需要一个Pass,它会将所有光照一次性按逐顶点的方式计算。

        其硬件要求最低,性能最高,效果最差,不支持逐像素


5.延迟渲染路径(Deferred)

5.1.处理光照的方式

        光照的数量无限制,并且都可以使用逐像素来渲染,支持法线纹理,阴影等效果的处理,但不能处理半透明物体,也不支持真正的抗锯齿,这些会自动使用前向渲染路径

        延迟渲染的效率不取决于场景复杂度,而是与我们使用的屏幕空间的大小有关。原因是延迟渲染路径除了使用颜色缓冲和深度缓冲外,还会使用一个叫G缓存的额外缓存区来存储我们关心的表面(通常是离摄像机最近的表面)的其他信息,如表面的法线,位置,材质属性等。这些缓存区可以理解为一张张的2D图片,我们实际上是在对这些图片进行处理

5.2.在哪里进行光照计算

        同样是Pass通道,主要包含两个Pass

        第一个Pass:主要判断哪些片元可见,并将可见片元的信息存储到G缓存区中,如表面法线,视角向量,漫反射系数等。该Pass通常无需我们自己实现,且对于每个物体,该Pass只会执行一次

        第二个Pass:利用G缓存区中各个片元的相关信息进行真正的相关计算,最终将颜色写入到颜色缓冲区中。使用这个需要将LightMode设置为Deferred。而且这个Pass默认情况下只能Unity内置的标准光照模型进行计算

5.3.内置光照变量

        需要包含UnityGBuffer.cginc

        sampler2D _CameraGBufferTexture0(1, 2, 3...)

        这些变量是自定义变量,第一个Pass的数据会存在它们中。0为漫反射颜色(RGB),遮挡(A);1为镜面反射颜色(RGB),粗糙度(A);2为世界空间法线(RGB),未使用(A);3为发射 + 光照 + 光照贴图 + 反射探针缓冲区;4为光照遮挡值(RGBA)


6.对比

6.1.光源的渲染

        前向:先划分等级,再渲染

        顶点:都按逐顶点,最多八个

        延迟:都可逐像素渲染,光源数量无限制,不能处理半透明物体,不支持真正的抗锯齿

6.2.Pass

        前向:Base:处理一个平行光,所有中低质量光源

                   Additional:除平行光之外的所有高质量

        顶点:一个Pass按逐顶点处理一次性处理所有光源

        延迟:第一个Pass:判断哪些片元可见,并将可见光源信息存储到G缓存

                   第二个Pass:利用G缓存信息进行计算,最终将颜色写入

6.3.优缺点

        前向:优:适用于相对简单的场景和较少数量的光源,基本可以实现任何渲染效果

                   缺:复杂场景和大量光源情况下开销大

        顶点:优:性能开销小

                   缺:效果垃圾

        延迟:优:适用于复杂场景和大量光源,能有效减少光照计算的开销

                   缺:对于透明物体和一些特殊效果不饿能直接支持,需要复杂的处理


7.如有疏漏,还请指出


http://www.kler.cn/a/539525.html

相关文章:

  • 深度学习|表示学习|Instance Normalization 全面总结|26
  • 如何在Android Studio中开发一个简单的Android应用?
  • mysql 存储过程和自定义函数 详解
  • CSS 相关知识
  • 【Ubuntu】安装和使用Ollama的报错处理集合
  • Java ArrayList 扩容机制详解
  • 数据表记录
  • Nginx配置 ngx_http_proxy_connect_module 模块及安装
  • 加速汽车软件升级——堆栈刷写技术的应用与挑战
  • go语言文件和目录
  • RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决
  • 用jit部分python函数效率过低的问题
  • java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle
  • HTML之CSS三大选择器
  • 110,【2】攻防世界 web mfw
  • ScrapeGraphAI颠覆传统网络爬虫技术
  • 未来科技趋势浅析
  • scss模块化
  • 如何用.NET Core Identity实现定制化的用户身份验证系统
  • Vue 响应式渲染 - 条件渲染
  • PHP-综合3
  • PrimeFaces Poll组件实现周期性Ajax调用
  • S4 HANA金税接口
  • STM32的HAL库开发---高级定时器---互补输出带死区实验
  • 集成开发环境GoLand安装配置结合内网穿透实现ssh远程访问服务器
  • Stable Diffusion室内设计文生图实操