正在整理中,很多网上找的,慢慢细化,先看一下一个物体的渲染流程
很明显,你所需要做的主要有两块代码,一个是顶点渲染,一个是片段渲染
shader"likang/king05"//首字母大小写均可
{
properties//首字母大小写均可
{
// 在inspector 面板显示的属性都写在这里
_MainTex("baseTexture",2d) = "white"{}
}
//顶点着色器和片段着色器
//子着色器(SubShader):一个Shader可以有多个子着色器。这些子着色器互不相干且只有
//一个会在最终的平台运行。编写多个的目的是解决兼容性问题。Unity会自己选择兼容终端
//平台的Shader运行。
subshader
{
pass
{
CGPROGRAM //必须大写,不然会报错
//cgprogram
//指定了vertex和fragment programs的名字
#pragma vertex vert //vertex 不能大写 顶点着色器函数vert,#后面一般为函数包含,调用vert函数
#pragma fragment frag //fragment 不能大写 片段着色器函数frag
#include "unitycg.cginc" //引用库,包含很多辅助函数
sampler2D _MainTex; //纹理2D
//不声明_MainTex_ST
float4 _MainTex_ST; //纹理的缩放和偏移 就是Tiling/Offset 值(Tiling.x,Tiling.y,Offset.x,Offset.y)
struct v2f//定义一个结构体,计算顶点数据
{ //准备顶点数据
//SV_POSITION 输出的数据结构包含了最终转换过的,将用于光栅化的顶点坐标
//POSITION 转换之前的模型顶点坐标(自身坐标轴)
//模型顶点坐标要经过一系列的矩阵变换,最终变成屏幕上的像素坐标
//回答是SV_前缀的变量代表system value,在DX10以后的语义绑定中被使用代表特殊的意义,和POSITION用法并无不
float4 pos:SV_POSITION;//POSITION为什么是float4而不是float3,是因为最后一维是W,xyzw,W指的是缩放,默认1
float2 uv:TEXCOORD0; //第一张贴图的uv坐标 TEXCOORD1 第二张贴图的uv坐标
};
//unity内置的常用数据结构
//appdata_base 其含义就是输入到顶点着色器的数据(包含position,normal,one texture coordinate)
//appdata_tan 输入到顶点着色器的数据(包含position,normal,tangent,one texture coordinate)
//appdata_full 输入到顶点着色器的数据(包含position,normal,tangent,vertex color,two texture coordinates)
//appdata_img 输入到顶点着色器的数据(包含position,one texture coordinate)
v2f vert(appdata_base v)
{
v2f o;//声明输出结构
//顶点数据矩阵变换投影到屏幕
// o.pos = UnityObjectToClipPos(v.vertex);等同于o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//前者性能上优于后者,unity推荐使用前者
//UNITY_MATRIX_MVP为unity内置的矩阵。该矩阵乘以顶点在模型坐标系下的坐标得到投影坐标
//类似的矩阵还有 UNITY_MATRIX_MV 模型坐标系(以模型某点为原点)-->观察者坐标系(以相机为原点)
//UNITY_MATRIX_VP 观察者坐标系-->投影坐标系
//UNITY_MATRIX_T_MV 转置模型-->观察者坐标系
//UNITY_MATRIX_TEXTURE0 to UNITY_MATRIX_TEXTURE3 纹理变换矩阵 等等……
//mul(M,v) 矩阵与向量相乘 得到新的向量(模型坐标在投影坐标系下的新坐标)
o.pos = UnityObjectToClipPos(v.vertex);
//UV在这里跟重复度和偏移做运算
//TRANSFORM_TEX 函数的含义就是将顶点的uv坐标和Tiling和Offset做运算
//因此你在shader属性中变化Tiling和Offset的值,纹理会发生改变
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
//上面的等式等同于o.uv = v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw;
//所以上面要声明_MainTex_ST变量,不然这里会报错
//如果采用默认的Tiling(1,1),Offset(0,0),那么在shader面板改变Tiling和Offset的值就没什么用了
// o.uv = v.texcoord.xy;
return o;
}
//将经过顶点着色器处理过的数据拿给片段着色器接着处理(给每个像素着色)
//frag函数
float4 frag(v2f i) :COLOR
{
//tex2D函数 CG内置函数:用来采样2d纹理
float4 texCol = tex2D(_MainTex,i.uv);
return texCol;
}
ENDCG
//endcg
}
}
fallback"diffuse"
}