【Shader】Unity Unlit Shader(无光照着色器)

  • Post author:
  • Post category:其他



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程序中的变量必须和之前变量相同的名字进行声明 
  
  
  1. 如果我们想要在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