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 }