遇到的问题:运行时mul()函数总是出错
1、
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MVPTransform : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//4x4矩阵旋转矩阵
Matrix4x4 RM = new Matrix4x4();
RM[0, 0] = Mathf.Cos(Time.realtimeSinceStartup); //第1行第1列
RM[0, 2] = Mathf.Sin(Time.realtimeSinceStartup); //第1行第3列
RM[1, 1] = 1; //第1行第2列
RM[2, 0] = -Mathf.Sin(Time.realtimeSinceStartup); //第3行第1列
RM[2, 2] = Mathf.Cos(Time.realtimeSinceStartup); //第3行第3列
RM[3, 3] = 1; //第4行第4列
//transform.localToWorldMatrix:物体的模型到世界矩阵的包装
//Camera.main.worldToCameraMatrix:从世界到摄像机的矩阵
//Camera.main.projectionMatrix:投影的矩阵
//矩阵相乘是有顺序的,如果顺序不对,则有可能出错
Matrix4x4 mvp = Camera.main.projectionMatrix * Camera.main.worldToCameraMatrix * transform.localToWorldMatrix*RM;
//给mvp赋值
GetComponent<Renderer>().material.SetMatrix("mvp",mvp);
}
}
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/s_eight" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float4x4 mvp;
struct v2f {
float4 pos:POSITION;
};
v2f vert(appdata_base v) {
v2f o;
//o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
//使用自定义的新的矩阵来影响矩阵
o.pos = mul(mvp, v.vertex);
return o;
}
fixed4 frag():COLOR{
return fixed4(1,1,1,1);
}
ENDCG
}
}
}
矩阵在旋转:
2、将矩阵作为参数传递
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MVPTransform : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//4x4矩阵旋转矩阵
Matrix4x4 RM = new Matrix4x4();
RM[0, 0] = Mathf.Cos(Time.realtimeSinceStartup); //第1行第1列
RM[0, 2] = Mathf.Sin(Time.realtimeSinceStartup); //第1行第3列
RM[1, 1] = 1; //第1行第2列
RM[2, 0] = -Mathf.Sin(Time.realtimeSinceStartup); //第3行第1列
RM[2, 2] = Mathf.Cos(Time.realtimeSinceStartup); //第3行第3列
RM[3, 3] = 1; //第4行第4列
//transform.localToWorldMatrix:物体的模型到世界矩阵的包装
//Camera.main.worldToCameraMatrix:从世界到摄像机的矩阵
//Camera.main.projectionMatrix:投影的矩阵
//矩阵相乘是有顺序的,如果顺序不对,则有可能出错
Matrix4x4 mvp = Camera.main.projectionMatrix * Camera.main.worldToCameraMatrix * transform.localToWorldMatrix;
//给矩阵rm赋值
GetComponent<Renderer>().material.SetMatrix("rm",mvp);
}
}
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/s_eight" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float4x4 mvp;
float4x4 rm;
struct v2f {
float4 pos:POSITION;
};
v2f vert(appdata_base v) {
v2f o;
//与rm矩阵相乘得到一个新的旋转矩阵
float4x4 m = mul(UNITY_MATRIX_MVP,rm);
//再用新的旋转矩阵相乘得到最终的矩阵变换顶点
o.pos = mul(m,v.vertex);
//使用自定义的新的矩阵来影响矩阵
//o.pos = mul(mvp, v.vertex);
return o;
}
fixed4 frag() :COLOR{
return fixed4(1,1,1,1);
}
ENDCG
}
}
}
运行后的结果:沿y轴旋转
3、缩放矩阵
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MVPTransform : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
//4x4矩阵旋转矩阵
Matrix4x4 RM = new Matrix4x4();
RM[0, 0] = Mathf.Cos(Time.realtimeSinceStartup); //第1行第1列
RM[0, 2] = Mathf.Sin(Time.realtimeSinceStartup); //第1行第3列
RM[1, 1] = 1; //第1行第2列
RM[2, 0] = -Mathf.Sin(Time.realtimeSinceStartup); //第3行第1列
RM[2, 2] = Mathf.Cos(Time.realtimeSinceStartup); //第3行第3列
RM[3, 3] = 1; //第4行第4列
//缩放矩阵
Matrix4x4 SM = new Matrix4x4();
SM[0, 0] = Mathf.Sin(Time.realtimeSinceStartup);
SM[1, 1] = Mathf.Cos(Time.realtimeSinceStartup);
SM[2, 2] = Mathf.Sin(Time.realtimeSinceStartup);
SM[3, 3] = 1;
//transform.localToWorldMatrix:物体的模型到世界矩阵的包装
//Camera.main.worldToCameraMatrix:从世界到摄像机的矩阵
//Camera.main.projectionMatrix:投影的矩阵
//矩阵相乘是有顺序的,如果顺序不对,则有可能出错
Matrix4x4 mvp = Camera.main.projectionMatrix * Camera.main.worldToCameraMatrix * transform.localToWorldMatrix;
//给矩阵赋值
GetComponent<Renderer>().material.SetMatrix("sm", SM);
}
}
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/s_eight" {
SubShader{
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "unitycg.cginc"
float4x4 mvp;
float4x4 rm;
float4x4 sm;
struct v2f {
float4 pos:POSITION;
};
v2f vert(appdata_base v) {
v2f o;
//与rm矩阵相乘得到一个新的旋转矩阵
float4x4 m = mul(UNITY_MATRIX_MVP,sm);
//再用新的旋转矩阵相乘得到最终的矩阵变换顶点
o.pos = mul(m,v.vertex);
//使用自定义的新的矩阵来影响矩阵
//o.pos = mul(mvp, v.vertex);
return o;
}
fixed4 frag() :COLOR{
return fixed4(1,1,1,1);
}
ENDCG
}
}
}
运行后的结果:
4、分别控制不同轴向上的变换
5、
6、