9.ShaderLab-ShaderLab语法规则-Shader的备用着色器
9.1 知识点
知识回顾
ShaderLab主要由4个部分组成:
- Shader的名字
- Shader的属性
- 1~n个子着色器
- 备用的Shader
//第一部分:
Shader "着色器名字"
{
//第二部分
Properties
{
//材质面板上可以看到的属性
}
//第三部分
SubShader
{
Tags(渲染标签)
States(渲染状态)
Pass(渲染通道1)
Pass(渲染通道2)
....(渲染通道n)
}
SubShader
{
Tags(渲染标签)
States(渲染状态)
Pass(渲染通道1)
Pass(渲染通道2)
....(渲染通道n)
}
.....可以有n个SubShader代码块
//第四部分
Fallback "备用的Shader"
}
备用Shader的作用
我们知道ShaderLab当中允许有多个SubShader子着色器。当执行渲染时,会从上到下使用第一个能够正常执行的SubShader子着色器来渲染对象。
那有没有可能所有SubShader子着色器都不能够在显卡上执行呢?答案是肯定的。有可能出现在某一个设备上,我们自定义的所有SubShader都无法正常执行(设备显卡无法支持一些API等情况)。那么这时备用Shader就可以起到很大作用了,它至少可以让对象能够正常渲染出来。
因此,备用Shader主要作用就是当Shader文件中的所有SubShader子着色器都无法正常运行时,起到一个保险作用,让物体能够使用一个最低级的Shader去渲染出来(效果略差,但至少能够显示)。
备用Shader的语法
Fallback "Shader名"
或者
Fallback Off
在Fallback关键词后面空格并通过一个字符串来告诉Unity“最低级的Unity Shader”是谁。也可以直接关闭Fallback功能,但是如果关闭那就意味着“放弃治疗”。
9.2 知识点代码
Lesson09_ShaderLab_ShaderLab语法规则_Shader的备用着色器
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson09_ShaderLab_ShaderLab语法规则_Shader的备用着色器 : MonoBehaviour
{
void Start()
{
#region 知识回顾
//ShaderLab主要由4个部分组成
//1.Shader的名字
//2.Shader的属性
//3.1~n个子着色器
//4.备用的Shader
//第一部分
//Shader "着色器名字"
//{
// //第二部分
// Properties
// {
// //材质面板上可以看到的属性
// }
// //第三部分
// SubShader
// {
// Tags(渲染标签)
// States(渲染状态)
// Pass(渲染通道1)
// Pass(渲染通道2)
// ....(渲染通道n)
// }
// SubShader
// {
// Tags(渲染标签)
// States(渲染状态)
// Pass(渲染通道1)
// Pass(渲染通道2)
// ....(渲染通道n)
// }
// .....可以有n个SubShader代码块
// //第四部分
// Fallback "备用的Shader"
//}
#endregion
#region 知识点一 备用Shader的作用
//我们知道ShaderLab当中允许有多个SubShader子着色器
//当执行渲染时,会从上到下使用第一个能够正常执行的SubShader子着色器来渲染对象
//那有没有可能所有SubShade子着色器都不能够在显卡上执行呢?
//答案是肯定的
//有可能出现在某一个设备上,我们自定义的所有SubShader都无法正常执行(设备显卡无法支持一些api等情况)
//那么这时备用Shader就可以起到很大作用了,它至少可以让对象能够正常渲染出来
//因此
//备用Shader主要作用就是当Shader文件中的所有SubShader子着色器都无法正常运行时
//起到一个保险作用,让物体能够使用一个最低级的Shader去渲染出来(效果略差,但至少能够显示)
#endregion
#region 知识点二 备用Shader的语法
//Fallback "Shader名"
//或者
//Fallback Off
//在Fallback关键词后面空格并通过一个字符串来告诉Unity
//“最低级的Unity Shader”是谁
//也可以直接关闭Fallback功能,但是如果关闭那就意味着“放弃治疗”
#endregion
#region 总结
//备用Shader的语法非常简单
//Fallback "Shader名"
//或者
//Fallback Off
//它的主要作用就是提供“救命稻草”
//我们一般会使用较为低级的效果作为备用Shader
//确保对象在低端设备上也能够正常渲染
#endregion
}
}
Lesson09_NewUnlitShader.shader
Shader "ShaderTeach/Lesson09_NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
Fallback "VertexLit"
// Fallback Off
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com