《Unity Shader入门精要》总结 #第九章 更复杂的光照

1、Unity的渲染路径

主要有3种:前向渲染路径、延迟渲染路径、顶点照明渲染路径

摄像机单独设置,若选择User Player Settings,则摄像机会使用Project Settings的设置;否则覆盖掉Project Settings的设置

,若当前显卡并不支持所选择的路径,则Unity会使用更低一级的渲染路径。

标签名 描述
Always 不管使用哪种渲染路径,该Pass总是会被渲染,而不计算任何光照
ForwardBase 用于前向渲染,该Pass会计算环境光、最重要的平行光、逐顶点/SH光源和Lightmaps
ForwardAdd 用于前向渲染,该Pass会计算额外的逐项素光源,每个Pass对应一个光源
Deferred 用于延迟渲染,该Pass会渲染G缓冲(G-buffer)
ShadowCaster 把物体的深度信息渲染到阴影映射纹理(shadowmap)或一张深度纹理中
PrepassBase 用于遗留的延迟渲染,该Pass会渲染法线和高光反射的指数部分
PrepassFinal 用于遗留的延迟渲染,该Pass通过合并纹理、光照和自发光来渲染得到的最后的颜色
Vertex、VertexLMRGBM和VertexLM 用于遗留的顶点照明渲染

1.1 前向渲染路径

前向渲染的原理

每进行一次完整的前向渲染,我们需要渲染该对象的渲染图元并计算两个缓冲区的信息:颜色缓冲区和深度缓冲区

伪代码:

Pass{
    for(each primitive in this model)
        for(each fragment covered by this primitive){
            if(failed in depth test){
                discard;
            }else{
                fixed4 color = Shading(materialInfo, pos, normal, lightDir, viewDir);
                writeFrameBuffer(fragment, color);
            }
        }
}

对于每个逐像素光源就需要进行上面一次完整的渲染流程。如果一个物体在多个逐像素光源的影响区域内,该物体需要执行多个Pass,每个Pass计算一个逐像素光源的光照结果,然后在帧缓冲中把这些光照结果混合起来得到最终颜色值。N个物体M个光源,则需要N*M个Pass,如果有大量逐像素光照,则计算量大,通常会限制每个物体的逐项素光源数目。

Unity中的前向渲染

3种处理光照方式:逐顶点处理、逐像素处理、球谐函数处理。决定光源使用哪种处理模式取决于其类型和渲染模式。光源类型指的是该光源是平行光还是其他类型的光源,而光源的渲染模式指的是该光源是否是重要的。在Light组件中设置这些属性。一定数目的光源按照逐像素处理,至多4个光源按照逐顶点处理,其余的按照球谐函数处理

有如下规则:

-场景中最亮的平行光总是按照像素处理

-渲染模式被设置成Not Important的光源按逐顶点/SH处理

-设置成Important的光源按照逐像素处理

-如果以上规则得到的逐像素光源数量小于Quality Setting中的逐像素光源数量,则会有更多的光源以逐像素的方式进行渲染

Base Pass和Additional Pass的区别

  可实现的光照效果 渲染设置 光照计算
Base Pass 光照纹理、环境光、自然光、阴影(平行光的阴影)

Tags{"LightMode" = "ForwardBase"}

#pragma multi_compile_fwdbase

一个逐像素的平行光

所有逐顶点和SH光源

Additional Pass

默认情况不支持阴影

(可通过#pragma multi_compile_fwdadd_fullshadows开启)

Tags{"LightMode" = "ForwardAdd"}

Blend One One

#pragma multi_compile_fwdadd

其他影响该物体的逐像素光源

每个光源执行一次Pass

-Base Pass中支持一些光照特性,可以访问lightmap

-Base Pass中渲染的平行光默认支持阴影(若开启了光源的阴影功能),而Additional Pass中渲染的光源默认情况下没有,但可以通过编译指令开启点光源和聚光灯阴影效果

-环境光与自发光在Base Pass中计算,若在Addtional Pass计算则会叠加多次环境光和自发光

-在Additional Pass的渲染设置中开启和设置了混合模式,我

### Unity Shader入门教程 #### 什么是着色器? 着色器是一种特殊的程序,用于定义物体表面的颜色和材质属性。在Unity中,着色器主要负责计算像素颜色、光照效果和其他视觉特性[^2]。 #### 着色器的工作原理 着色器通常由顶点着色器(Vertex Shader)和片段着色器(Fragment Shader,也称为Pixel Shader)组成: - **顶点着色器**:处理网格中的每一个顶点位置信息,并对其进行变换操作。 - **片段着色器**:决定屏幕上每个像素最终显示的颜色值。 两者协同工作来渲染出逼真的图像效果。 #### 创建第一个简单着色器 下面是一个非常简单的自定义着色器例子,它会将对象染成纯红色: ```csharp Shader "Custom/SimpleRed" { Properties { _Color ("Main Color", Color) = (1,0,0,1) } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata_t { float4 vertex : POSITION; }; struct v2f { float4 pos : SV_POSITION; }; fixed4 _Color; v2f vert(appdata_t v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag(v2f i) : COLOR { return _Color; } ENDCG } } } ``` 这段代码展示了如何编写一个基本的CG/HLSL语法下的Unity着色器脚本文件。这里设置了单一颜色属性并应用于整个模型表面上。 #### 使用内置函数简化开发过程 为了方便快捷地构建复杂的着色逻辑,Unity提供了许多预定义的功能宏(`#pragma`)指令以及辅助库函数帮助开发者快速搭建起所需的效果而不必从零开始编码每一部分细节。 例如,在上面的例子中使用的`UnityObjectToClipPos()`就是一个典型代表,它可以轻松完成世界坐标到裁剪坐标的转换任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值