UnityShader基础(上)
- 引言:Shader基础内容由于内容较多分为多个部分记录
渲染路径
渲染路径概述
渲染路径是什么??
概念:
渲染路径(Rendering Path)是指在图形渲染过程中,图形引擎按照特定的步骤和顺序来处理场 景中的几何、光照、材质等信息,最终生成屏幕上的图像的一种算法或策略。 它决定了图形引擎如何组织和执行渲染过程,以产生最终的视觉效果
对于我们来说:
在Unity中,
渲染路径决定了光照如何应用到Unity Shader中
,如果要在Unity Shader中和光源打交道,我们需要为每个Pass渲染通道匹配对应的渲染路径,这样才能在Shader 当中获取到正确的光源数据进行处理
。总结:
渲染路径会影响光照处理,从而影响最终的渲染效果(光照、阴影等)。 存在多种不同的渲染路径
为什么会影响:
我们可以简单理解,使用不同的渲染路径时,Unity在Shader中准备光源数据的流 程是不同的,那么我们在Shader开发时,获取光源数据的方式就会有所不同。
渲染路径的种类和设置
我们可以在Camera组件中的Rendering Path(渲染路径)对其进行修改 在
内置渲染管线
中主要有3种渲染路径,分别是:
Forward(前向渲染路径)
默认的标准的渲染方式,适用于相对简单的场景和较少的光源
Deferred(延迟渲染路径)
可以处理较复杂的场景,有大量光源时可以提供更好的性能 3
Legacy Vertex Lit((遗产)顶点照明渲染路径)
较适用于为简单的渲染方式,适用于性能受限的场景。 基本已经不会使用
注意:
当显卡不支持选定的渲染路径时会自动选择一个较低精度的渲染路径 比如不支持延迟渲染路径时,前向渲染路径会被采用
LightMode标签的作用
我们之前在编写Shader时都会使用
LightMode
(光模式)标签。它的主要作用就是来
指明该Pass 匹配的渲染路径是哪种 只要匹配正确,我们便可以获取到正确的光源相关数据
注意:
LightMode标签通常应该与Camera中的Rendering Path匹配
用于指定Pass在渲染过程中的哪个阶段
如果它们不匹配,可能导致渲染不正确
LightMode 标签支持的渲染路径设置选项有
在Shader开发中如果我们
不进行LightMode渲染标签的设置
。比如摄像机默认的是前向渲染路径,但是我们没有为Pass设置相 标签名 Always ForwardBase 关的标签,
那么这个Pass会被当
作一个顶点照明渲染路径的Pass
。ForwardAdd 这时光源相关的数据就不会被正确的进行赋值,我们计算出来的 结果就会出现错误,从而可能呈现出错误的渲染效果。
前向渲染路径
前向渲染路径处理光照的方式
逐像素处理(需要高等质量处理的光)
逐顶点处理(需要中等质量处理的光)
球谐函数(SH)处理(需要低等质量处理的光)
球谐函数处理光照的方式是将光照场景投影到球谐函数的空间中,通过一组球谐系数来表示光照。 内存换性能,细节表现效果差(不需要我们自己书写,Unity底层会帮助我们进行处理)
场景当中的各种光源将采用哪种方式处理?
在前向渲染中,一部分最亮的灯光以逐像素处理,然后4个点光源 以逐顶点方式处理,其余的灯光以SH处理
一个光源是逐像素、逐顶点还是SH处理主要取决于以下几点:
注意:如果灯光渲染模式设置为Auto(自动),Unity会根据灯光的亮度以及与物体的距离自动判断重要性
渲染模式设置为Not Important(不重要)的灯光始终以 逐顶点或者SH的方式渲染
渲染模式设置为Important(重要)的灯光始终是逐像素渲染
最亮的平行光总是逐像素渲染
如果逐像素光照的灯光数量少于项目质量设置中的 Pixel Light Count(像素灯光计数)的数量,那么其余比较亮的 灯光将会被逐像素渲染
举例说明:
简而言之:
Unity当中有一套划分光源“三六九等”的规则
主要通过灯光渲染模式、项目质量设置中的像素灯光计数的数量、 光照强度、距离物体距离来综合判定
前向渲染路径在哪里进行光照计算??
Base Pass(基础渲染通道)
渲染物体的主要光照通道,用于处理主要的光照效果
主要用于计算逐像素的平行光以及所有逐顶点和SH光源
可实现的效果:漫反射、高光反射、自发光、阴影、光照纹理等
Additional Pass(附加渲染通道)
渲染物体额外的光照通道,用于处理一些附加的光照效果
主要用于计算其他影响物体的逐像素光源
每个光源都会执行一次该Pass
可实现的效果:描边、轮廓、辉光等
对于一个前向渲染路径下的Unity Shader
通常会
定义一个Base Pass(基础渲染通道)
以及一个Additional Pass(附加渲染通道)
每次渲染时
一
个Base Pass仅会执行一次
(多个Base Pass情况除外)主要用于渲染环境光或自发光而
一个Additional Pass会根据影响该物体的其他逐像素光源的数量被多次调用
每个逐像素光源都会调用一次Additional Pass 由于开启了混合,渲染结果会和之前的光照颜色进行混合
注意:
Base Pass也可以有多个,比如需要双面渲染的情况
Base Pass默认支持阴影, Additional Pass默认不支持
可以通过添加#pragma multi_compile_fwdadd_fullshadows编译指令开启阴影
这些Pass当中我们具体处理光照的方式是由我们自己决定的,使用逐顶点光照还是逐像素光照的计算方式 都根据我们的具体实现而定,前文提到的逐像素光源只是按照期望处理类型来分的而已
总结:
前向渲染路径的内置光照变量和函数
常用内置光照变量
常用内置光照函数
顶点照明渲染路径
顶点照明渲染路径处理光照的方式
- 顶点照明渲染路径仅仅是前向渲染路径的一个子集
- 所有在顶点照明渲染路径中能实现的效果都可以在前向渲染路径中实现
它对硬件配置要求最少、运算性能最高,但是效果是最差的
- 它不支持那些逐像素才能得到的效果,比如阴影、法线纹理、高精度高光反射等
- 它的基本思想就是所有的光都按照
逐顶点
的方式进行计算的- 在内置渲染管线中,它只会最多记录8个光源的数据,会根据光源类型、强度、距离等因素来决定
- Unity中的
顶点照明渲染路径只会将光相关的数据填充到那些逐顶点相关的内置光源变量
中- 意味着我们不
能像前向渲染路径中那样使用逐像素相关的内置变量
- 注意:顶点照明渲染路径使用场景较少,我们主要做了解
顶点照明渲染路径在哪里进行光照计算
顶点照明渲染路径通常在
一个Pass
当中就可以完成对物体的渲染
在这个Pass当中我们会计算我们关心的所有光源对该物体的影响
并且会
按照逐顶点的方式一次性对所有光照去进行计算
因此它是Unity内置渲染管线当中最快速的渲染路径,并且具有最广泛的硬件支持 只是相对来说渲染效果最差
顶点照明渲染路径的内置光照变量和函数
常用内置光照变量
常用内置光照函数
延迟渲染路径
延迟渲染路径处理光照的方式
延迟渲染路径对
光照的数量没有任何限制
,并且所有灯光都可以采用逐像素渲染
。理论上来说,即 使场景中有成百上千个实时灯光,依然可以保持比较流畅的渲染帧率。
它支持法线纹理、阴影等等效果的处理;但是它不能处理半透明物体,并且不支持真正的抗锯齿。 这些会自动使用前向渲染路径。
延迟渲染路径在哪里进行光照计算
延迟渲染路径中主要包含两个Pass:
第一个Pass(对于每个物体,该Pass只会执行一次,通常无需我们自己实现)
主要判断哪些片元可见,并且将可见片元的相关信息存储到G缓冲区中
- 比如:表面法线、视角方向、漫反射系数等等数据
第二个Pass
利用G缓冲区中各个片元的相关信息进行真正的相关计算,最终将颜色写入颜色缓冲区
注意: 在
第二个Pass中
计算光照时,默认情况下只能用Unity内置的标准(Standard)光照模型
计算