Shader "Unlit/xxShader"
{
Properties
{
//基础属性 并可以显示在属性板上
_MainTex ("Texture", 2D) = "white" {}
}
//子着色器(SubShader):一个Shader可以有多个子着色器。这些子着色器互不相干且只有一个会在最终的平台运行。
//编写多个的目的是解决兼容性问题。Unity会自己选择兼容终端平台的Shader运行。
SubShader
{
//设置渲染队列、渲染类型、阴影、投影,硬件将通过判定这些标签来决定什么时候调用该着色器
Tags { "RenderType"="Opaque" }
//Shader LOD 就是让我们设置一个数值,Unity内建Shader定义了一组LOD的数值,这个数值决定了我们能用什么样的Shader。
//通过LOD,我们就可以为某个材质写一组SubShader,指定不同的LOD,LOD越大则渲染效果越好,当然对硬件的要求也可能越高
//然后根据不同的终端硬件配置来设置 globalMaximumLOD来达到兼顾性能的最佳显示效果。
LOD 100
//顶点片段的Shader需要在Pass通道里编写
//一个Pass就是一次绘制
//可以有多个通道,每个通道都会渲染一遍,
//多次Pass可以实现很多特殊效果,例如当人物被环境遮挡时还可以看到人物轮廓就可以用多Pass来实现
//每个Pass中都可以包含自定义的Cg代码,从CGPROGRAM开始到ENDCG结束
Pass
{
//CG代码需要编写在CGPROGRAM...ENDCG之间
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 = mul(UNITY_MATRIX_MVP, 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
}
}
//如果不硬件不满足所有SubShadr则调用默认,最基础的shader
FallBack "Diffuse"
}
版权声明:本文为emailforwei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。