shader1.0和2.0的区别
2.0可以实现编程;
Shader2.0常用语义
POSITION: 获取模型顶点的信息。
NORMAL: 获取法线信息
TEXCOORD(n): 高精度的从顶点传递信息到片段着色器
COLOR: 表示低精度从顶点传递信息到片段着色器
TANGENT: 获取切线信息。
SV_POSITION: 表示经过mvp矩阵已经转化到屏幕坐标系
SV_TARGET: 输出到那个render target
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM //2.0
#pragma vertex vert //定义一个顶点着色器的 入口函数
#pragma fragment frag //定义一个片段着色器的 入口函数
#include "UnityCG.cginc" //引用
struct appdata
{
float4 vertex : POSITION; //POSITION获取模型顶点信息 normal 法线
float2 uv : TEXCOORD0; //
};
struct v2f //顶点着色器的 输出值 片段的输入值
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION; // 表示经过MVP矩阵 已经转化到屏幕坐标的位置
};
v2f vert (appdata v)//顶点着色器的入口函数 appdata从meshrender里面来的
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target //输出到 哪个render target
{
fixed4 col = tex2D(_MainTex, i.uv);
// just invert the colors
//col.rgb = 1 - col.rgb;
return col;
}
ENDCG
}
}
}
2.0要做什么
1.计算顶点位置变化;
2.计算顶点颜色
(U3D 里面 的矩阵是左乘)
1.1将 物体坐标系变换到
P(世界)=M(物体到世界的变换矩阵)*P(物体)
vector3 posWold=transform.parent.localToWorldMatrix.MultiplyPoint(transform.localPosition);
规律:3D变换 第一步都是将物体坐标系变换到世界坐标系。
1.2 将 世界坐标 变换到 相机坐标系。
P(相机)=M(世界到相机的变换矩阵)*P(世界)
transform.worldToLocalMatrix.MultiplyPoint(posWold);
MVP
M:物体坐标系》》世界坐标系
V:世界坐标系》》相机坐标系
P:将3D坐标系》》2D屏幕坐标系
UNITY_MATRIX_MVP 当前模型视图投影矩阵
UNITY_MATRIX_MV 当前模型视图矩阵
UNITY_MATRIX_V 当前视图矩阵。
UNITY_MATRIX_P 目前的投影矩阵
UNITY_MATRIX_VP 当前视图*投影矩阵
UNITY_MATRIX_T_MV 移调模型视图矩阵
UNITY_MATRIX_IT_MV 模型视图矩阵的逆转
UNITY_MATRIX_TEXTURE0 UNITY_MATRIX_TEXTURE3 纹理变换矩阵
更新后现在
在unity5.6以上版本中,shader中的语句改变
UNITY_MATRIX_MVP》》UnityObjectToClipPos
UNITY_MATRIX_VP》》UnityWorldToClipPos,
UNITY_MATRIX_P》》UnityViewToClipPos
Pass中加上一句 #include "UnityCG.cginc"