Unlit Shader(无光照着色器):
它是一个不包含光照(但包含雾效)的基本顶点/片元着色器
在shader 代码里加入了相对应的注释
Shader "Unlit/Cat"
{
Properties
{
//变量名_MainTex,检视窗口显示“Main Texture”,类型是宽高为2次幂的纹理,默认值为空。保存下看编辑器里的变化。
_MainTex ("Texture", 2D) = "white" {}
_TinColor("Color",color) = (1,1,1,1)
}
SubShader
{
// 作用:控制渲染引擎 何时 如何 将子shader内容进行呈现
//表示输出的是非透明物体
//还有一个 Tags { “Queue” = “Opaque” } 表示的是“指定在渲染非透明物体的顺序队列”
//区别:这两者最主要的区别在于“RenderType”表示的是渲染什么样的物体,而“Queue”表示的是在什么样的实际渲染物体。
Tags { "RenderType"="Opaque" }
LOD 100
// 查看语义网址 :https://msdn.microsoft.com/en-us/library/windows/desktop/bb509647.aspx
Pass
{
//#pragma的作用是指示编译对应的着色器函数
//标记下面是一段CG程序
CGPROGRAM
//声明了一个名为Vert的顶点函数
#pragma vertex vert
//声明了一个名为Vert的顶点函数
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
//UnityObjectToClipPos 需要引入 include "UnityCG.cginc
//作用 : 就是导入Unity通用CG预定义文件,后面的UnityObjectToClipPos函数就是在该文件里定义好的
#include "UnityCG.cginc"
//网格数据
struct appdata
{
//一个名为vertex的四维浮点数,语义为网格的顶点坐标数据。
float4 vertex : POSITION;
//UV(W) 是纹理空间中的多维坐标系 值域 0 到 1。这里使用 2D 纹理,因此是二维的。
// 分别在appdata和v2f结构体,添加变量uv,用于记录引入纹理的UV坐标。
float2 uv : TEXCOORD0;
};
//顶点到片元结构体”:用于储存从顶点函数输出和片元函数输入的数据,计算输出的顶点位置,自动绘制在屏幕上
//顶点输出到片元输入的结构体
//语义上的SV所代表的是System Value(系统值),SV_POSITION对应就是屏幕上的像素位置。
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
//这里定义的变量和属性名字相同,是将属性里的变量在Unity着色器内部进行数据绑定,为了CG程序正常访问属性
//所以CG程序中的变量必须和之前变量相同的名字进行声明
- 如果我们想要在SubShader中访问它,还需要在CGPROGRAM内部声明一个和Properties中名字相同的变量,这将自动建立一个连接,两者将操作同一个数据。
//sampler2D是与纹理绑定的数据容器接口,为CG/HLSL中 2D贴图的类型,相应还有sampler1D、sampler3D、samplerCUBE等格式。
sampler2D _MainTex;
float4 _MainTex_ST;
//顶点函数
v2f vert (appdata v)
{
v2f o;
//使用UnityObjectToClipPos方法,将输入网格顶点对象空间转换到屏幕剪裁平面
o.vertex = UnityObjectToClipPos(v.vertex);
//取到的网格数据上的UV信息(网格平铺成二维与纹理的一一对应),赋值给v2f结构体中。
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
//片元函数
// SV_Target 就是System Value Target,实际就是屏幕的像素
//最后frag函数return的就是像素,即RGBA颜色,因此frag返回的类型就是fixed4类型。
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;
}
//CG程序结束
ENDCG
}
}
}
附加
Properties
{
//变量名_MainTex,检视窗口显示“Main Texture”,类型是宽高为2次幂的纹理,默认值为空。保存下看编辑器里的变化。
_MainTex ("Texture", 2D) = "white" {}
_SecondTex("老子是老二 Texture",2D) = "white"{}
_TinColor("Color",color) = (1,1,1,1)
//滑动条
_Blend_Amount("Blend Amount",Range(0,1)) = 0.5
//[Header(Color Ramp Sample)],它用于在检视窗口中添加一个标签文本。这里是显示Color Ramp Sample。
[Header(Color Ramp Sample)]
//一般引入一个2D的纹理,都会有Tiling和Offset显示,即可以调节纹理的缩放与平移,使用了[NoScaleOffset]就会将这两个参数设置禁用,仅获得纹理的原始比例与平移。
[NoScaleOffset]_ColorRamp_SampleTexture("Sample Texture",2D) = "white"{}
_ColorRanm_Evaluation("Evaluation Position",Range(0,1)) = 0.5
}
_MainTex ("Texture", 2D) = "white" {}
{}这些花括号仅针对类型为2D、Rect和Cube的变量,如果你在其他类型变量后面添加了这些括号会出现编译错误。
Cg网站 : http://developer.download.nvidia.com/CgTutorial/cg_tutorial_appendix_e.html