unity自带的mvp矩阵。 说起这个就是感觉神秘并且高大上呀。下面我们看看unity中如何使用内嵌的变量和C#中的自己构建的mvp矩阵。
参考网址:http://www.2cto.com/kf/201603/495108.html
1、内嵌变量
Shader "xxx/ddd" { SubShader { pass { CGPROGRAM #pragma vertex vert //顶点函数的重命名 #pragma fragment frag //片段函数的重命名 #include "unitycg.cginc" //自定义的一个变量 struct v2f { float4 pos:POSITION; }; //必须返回顶点数据 v2f vert(appdata_base v) //appdata_base为内嵌变量 { v2f o; o.pos = mul(UNITY_MATRIX_MVP,v.vertex); //使用内嵌的mvp矩阵乘以顶点数据 return o; } void frag(out float4 col:COLOR) { col = float4(1,0,0,1); } ENDCG } } }说明: appdata_base 为unitycg.cginc中定义的变量。
struct appdata_base { float4 vertex : POSITION; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; };2、使用C#构建一个mvp矩阵 (1)C#代码:
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { void Update () { //注意顺序 //Matrix4x4 mvp = this.transform.localToWorldMatrix * Camera.main.projectionMatrix * Camera.main.worldToCameraMatrix; Matrix4x4 mvp = Camera.main.projectionMatrix * Camera.main.worldToCameraMatrix * this.transform.localToWorldMatrix; } }(2)shader代码:
Shader "xxx/ddd" { SubShader { pass { CGPROGRAM #pragma vertex vert //顶点函数的重命名 #pragma fragment frag //片段函数的重命名 #include "unitycg.cginc" float4x4 mvp; //定义变量,用C#赋值 struct v2f { float4 pos:POSITION; }; v2f vert(appdata_base v) { v2f o; o.pos = mul(mvp,v.vertex); //这里变化了 return o; } void frag(out float4 col:COLOR) { col = float4(1,0,0,1); } ENDCG } } }矩阵相乘是有顺序的,如果没有显示,就逆着相乘试试。