Unity Shader语法总结

1.unity中有两个渲染相关的组件:
mesh Filter用来存储一个网格mesh,网格是由三角面组成的,其中存储了三角面的一些顶点信息。
mesh renderer 用来渲染外观,这个必需要有的,能够指定材质(shader+贴图),贴图不是必要的。
2.shader是经过openGL,directX来进行编译运行的。openGL使用GLSL来编写shader,dx使用HLSL来编写shader。可是英伟达的CG实现了跨平台,因此unity对CG进行了封装,封装成了shaderLab。
3.三种着色器:
表面着色器:Surface Shader(比较简单,是封装好的,适用于多光源的处理)
顶点/片元着色器:Vertex/Fragment Shader(基础底层,其余两种都是在它基础上进行封装,能够实现更多的功能)
固定函数着色器:Fixed Function Shader(老一代显卡,几乎不使用)
4.shader的基本框架web

Shader "myshader"{
	Properties{
		_Color("Color",Color)=(1,1,1,1)
		_Vector("Vector",Vector)=(1,1,1,1)
		_Int("Int",Int)=4
		_Float("Float",Float)=4.4
		_Range("Range",Range(1,11))=6
		_Cube("Cube",Cube)="white"{}
		_2D("Texture",2D)="red"{}
		_3D("Texture",3D)="black"{}
	}
	SubShader{
		Pass{
			CGPROGRAM
			//若是要使用上面的属性,必须再pass里面再声明一次
			float4 _Color
			float3 _t1;
			float2 _t;
			float _Int;
			float _Range;
			float _Float;
			sampler2D _2D;
			samplerCube _Cube;
			sampler3D _3D;


#pragma vertex vert
			//顶点函数,这里只是声明了顶点函数的函数名
			//基本做用:从模型空间转换成裁剪空间(从游戏环境转换成视野屏幕上),每一个顶点都会调用该方法。

#pragma fragment frag
		//片元函数,这里只是声明了片元函数的函数名
		//基本做用:返回模型对应屏幕上的每个像素的颜色值

		//经过语义来进行解释float4属于哪一个空间,Position指定了v是模型空间的顶点坐标,SV_Position指定了函数的返回值是裁剪空间的。
		float4 vert(float4 v:POSITION):SV_POSITION{
			return mul(UNITY_MATRIX_MVP,v);//MATRIX是矩阵的意思,与该矩阵相乘能够把模型空间的顶点转换成裁剪空间
		}
		
		//SV_Target指定了返回的是屏幕上的每个像素的颜色值
		//用fixed比float节省空间,fixed的范围是-2到+2 ,float是32位的,half是16位的
		fixed4 frag():SV_Target{
			return fixed4(1,1,1,1);//把颜色转换成fixed4
		}
			ENDCG
		}
	}
	Fallback "VertexLit"
}

咱们也能够改一下,用类来把所须要用到的参数集结在一块app

//经过语义来进行解释float4属于哪一个空间,Position指定了v是模型空间的顶点坐标,SV_Position指定了函数的返回值是裁剪空间的。
			//application to vertex
			struct a2v{  
				float4 vertex:POSITION;//告诉UNITY把模型空间下的顶点坐标填充给vertex
				float3 normal:NORMAL;//告诉UNITY把模型空间下的法线坐标填充给normal
				float4 texcoord:TEXCOORD; //告诉UNITY把第一套纹理坐标填充给texcoord
			};
			struct v2f{
				float4 position:SV_POSITION;
				float3 temp:COLOR0;
			};
			//vert是对每一个顶点都会调用,顶点之间的像素会经过插值计算获得
		

v2f vert(a2v v){
		    v2f f;
			f.position=mul(UNITY_MATRIX_MVP,v.vertex);//MATRIX是矩阵的意思,与该矩阵相乘能够把模型空间的顶点转换成裁剪空间
			f.temp=v.normal;
			return f;
		}
		//SV_Target指定了返回的是屏幕上的每个像素的颜色值
		//frag是对每个像素进行调用的,会比vert好,可是更耗GPU
		//用fixed比float节省空间,fixed的范围是-2到+2 ,float是32位的,half是16位的
		fixed4 frag(v2f f):SV_Target{
			return fixed4(f.temp,1);//把颜色转换成fixed4
		}