服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - unity实现贴图矩阵运算(旋转平移缩放)

unity实现贴图矩阵运算(旋转平移缩放)

2022-09-27 14:19bommy游戏 C#

这篇文章主要为大家详细介绍了unity实现贴图矩阵运算,旋转平移缩放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

我们在shader中对贴图处理时,有时候会有一些比较复杂的运算,比方说三角函数,开方等,一般情况下,如果可以在越上层做运算,性能会越高。C# > Vertex > fragment

因此,考虑到贴图的旋转用到的三角函数,可以使用在C#中传入旋转矩阵得到,然后使用uv直接乘以矩阵就可以了。

封装了vmatrix4x4,分享一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using UnityEngine;
 
namespace D11.Skin
{
 public class VMatrix
 {
  public float[,] m;
 
  public VMatrix()
  {
   m = new float[4, 4];
   m[0, 0] = 0.0f; m[0, 1] = 0.0f; m[0, 2] = 0.0f; m[0, 3] = 0.0f;
   m[1, 0] = 0.0f; m[1, 1] = 0.0f; m[1, 2] = 0.0f; m[1, 3] = 0.0f;
   m[2, 0] = 0.0f; m[2, 1] = 0.0f; m[2, 2] = 0.0f; m[2, 3] = 0.0f;
   m[3, 0] = 0.0f; m[3, 1] = 0.0f; m[3, 2] = 0.0f; m[3, 3] = 0.0f;
  }
 
  public static void MatrixSetIdentity(VMatrix matrix)
  {
   matrix.m[0,0] = 1.0f; matrix.m[0,1] = 0.0f; matrix.m[0,2] = 0.0f; matrix.m[0,3] = 0.0f;
   matrix.m[1,0] = 0.0f; matrix.m[1,1] = 1.0f; matrix.m[1,2] = 0.0f; matrix.m[1,3] = 0.0f;
   matrix.m[2,0] = 0.0f; matrix.m[2,1] = 0.0f; matrix.m[2,2] = 1.0f; matrix.m[2,3] = 0.0f;
   matrix.m[3,0] = 0.0f; matrix.m[3,1] = 0.0f; matrix.m[3,2] = 0.0f; matrix.m[3,3] = 1.0f;
  }
 
  public static void MatrixBuildTranslation(VMatrix matrix, float x, float y, float z)
  {
   MatrixSetIdentity(matrix);
   matrix.m[0,3] = x;
   matrix.m[1,3] = y;
   matrix.m[2,3] = z;
  }
 
  public static void MatrixBuildTranslation(VMatrix matrix, Vector3 vec)
  {
   MatrixSetIdentity(matrix);
   matrix.m[0, 3] = vec.x;
   matrix.m[1, 3] = vec.y;
   matrix.m[2, 3] = vec.z;
  }
 
  public static void MatrixBuildScale(VMatrix matrix, float x, float y, float z)
  {
   matrix.m[0, 0] = x; matrix.m[0, 1] = 0.0f; matrix.m[0, 2] = 0.0f; matrix.m[0, 3] = 0.0f;
   matrix.m[1, 0] = 0.0f; matrix.m[1, 1] = y; matrix.m[1, 2] = 0.0f; matrix.m[1, 3] = 0.0f;
   matrix.m[2, 0] = 0.0f; matrix.m[2, 1] = 0.0f; matrix.m[2, 2] = z; matrix.m[2, 3] = 0.0f;
   matrix.m[3, 0] = 0.0f; matrix.m[3, 1] = 0.0f; matrix.m[3, 2] = 0.0f; matrix.m[3, 3] = 1.0f;
  }
 
  public static void MatrixBuildScale(VMatrix matrix, Vector3 scale)
  {
   MatrixBuildScale(matrix, scale.x, scale.y, scale.z);
  }
 
  public static void MatrixBuildRotate(VMatrix matrix, float angleDegrees)
  {
   float radians = angleDegrees * (Mathf.PI / 180.0f);
 
   float fSin = Mathf.Sin(radians);
   float fCos = Mathf.Cos(radians);
   matrix.m[0, 0] = fCos; matrix.m[0, 1] = -fSin; matrix.m[0, 2] = 0.0f; matrix.m[0, 3] = 0.0f;
   matrix.m[1, 0] = fSin; matrix.m[1, 1] = fCos; matrix.m[1, 2] = 0.0f; matrix.m[1, 3] = 0.0f;
   matrix.m[2, 0] = 0.0f; matrix.m[2, 1] = 0.0f; matrix.m[2, 2] = 1.0f; matrix.m[2, 3] = 0.0f;
   matrix.m[3, 0] = 0.0f; matrix.m[3, 1] = 0.0f; matrix.m[3, 2] = 0.0f; matrix.m[3, 3] = 1.0f;
  }
 
  public static VMatrix MatrixMultiply(VMatrix src1, VMatrix src2)
  {
   VMatrix dst = new VMatrix();
   dst.m[0,0] = src1.m[0,0] * src2.m[0,0] + src1.m[0,1] * src2.m[1,0] + src1.m[0,2] * src2.m[2,0] + src1.m[0,3] * src2.m[3,0];
   dst.m[0,1] = src1.m[0,0] * src2.m[0,1] + src1.m[0,1] * src2.m[1,1] + src1.m[0,2] * src2.m[2,1] + src1.m[0,3] * src2.m[3,1];
   dst.m[0,2] = src1.m[0,0] * src2.m[0,2] + src1.m[0,1] * src2.m[1,2] + src1.m[0,2] * src2.m[2,2] + src1.m[0,3] * src2.m[3,2];
   dst.m[0,3] = src1.m[0,0] * src2.m[0,3] + src1.m[0,1] * src2.m[1,3] + src1.m[0,2] * src2.m[2,3] + src1.m[0,3] * src2.m[3,3];
 
   dst.m[1,0] = src1.m[1,0] * src2.m[0,0] + src1.m[1,1] * src2.m[1,0] + src1.m[1,2] * src2.m[2,0] + src1.m[1,3] * src2.m[3,0];
   dst.m[1,1] = src1.m[1,0] * src2.m[0,1] + src1.m[1,1] * src2.m[1,1] + src1.m[1,2] * src2.m[2,1] + src1.m[1,3] * src2.m[3,1];
   dst.m[1,2] = src1.m[1,0] * src2.m[0,2] + src1.m[1,1] * src2.m[1,2] + src1.m[1,2] * src2.m[2,2] + src1.m[1,3] * src2.m[3,2];
   dst.m[1,3] = src1.m[1,0] * src2.m[0,3] + src1.m[1,1] * src2.m[1,3] + src1.m[1,2] * src2.m[2,3] + src1.m[1,3] * src2.m[3,3];
 
   dst.m[2,0] = src1.m[2,0] * src2.m[0,0] + src1.m[2,1] * src2.m[1,0] + src1.m[2,2] * src2.m[2,0] + src1.m[2,3] * src2.m[3,0];
   dst.m[2,1] = src1.m[2,0] * src2.m[0,1] + src1.m[2,1] * src2.m[1,1] + src1.m[2,2] * src2.m[2,1] + src1.m[2,3] * src2.m[3,1];
   dst.m[2,2] = src1.m[2,0] * src2.m[0,2] + src1.m[2,1] * src2.m[1,2] + src1.m[2,2] * src2.m[2,2] + src1.m[2,3] * src2.m[3,2];
   dst.m[2,3] = src1.m[2,0] * src2.m[0,3] + src1.m[2,1] * src2.m[1,3] + src1.m[2,2] * src2.m[2,3] + src1.m[2,3] * src2.m[3,3];
 
   dst.m[3,0] = src1.m[3,0] * src2.m[0,0] + src1.m[3,1] * src2.m[1,0] + src1.m[3,2] * src2.m[2,0] + src1.m[3,3] * src2.m[3,0];
   dst.m[3,1] = src1.m[3,0] * src2.m[0,1] + src1.m[3,1] * src2.m[1,1] + src1.m[3,2] * src2.m[2,1] + src1.m[3,3] * src2.m[3,1];
   dst.m[3,2] = src1.m[3,0] * src2.m[0,2] + src1.m[3,1] * src2.m[1,2] + src1.m[3,2] * src2.m[2,2] + src1.m[3,3] * src2.m[3,2];
   dst.m[3,3] = src1.m[3,0] * src2.m[0,3] + src1.m[3,1] * src2.m[1,3] + src1.m[3,2] * src2.m[2,3] + src1.m[3,3] * src2.m[3,3];
   return dst;
  }
 
  public Vector4 MatrixGetCol(int nCol)
  {
   System.Diagnostics.Debug.Assert((nCol >= 0) && (nCol <= 3));
 
   Vector4 vec;
   vec.x = m[0,nCol];
   vec.y = m[1,nCol];
   vec.z = m[2,nCol];
   vec.w = m[3,nCol];
   return vec;
  }
 
  public Vector4 MatrixGetRow(int nRow)
  {
   System.Diagnostics.Debug.Assert((nRow >= 0) && (nRow <= 3));
   Vector4 vec;
   vec.x = m[nRow, 0];
   vec.y = m[nRow, 1];
   vec.z = m[nRow, 2];
   vec.w = m[nRow, 3];
   return vec;
  }
 
  public static VMatrix GetSRTMatrix(Vector2 scale, float rotation, Vector2 center, Vector2 translation)
  {
   VMatrix mat = new VMatrix();
   VMatrix temp = new VMatrix();
 
   MatrixBuildScale(mat, scale.x, scale.y, 1.0f);
   MatrixBuildTranslation(temp, -center);
   mat = MatrixMultiply(temp, mat);
   MatrixBuildRotate(temp, rotation);
   mat = MatrixMultiply(temp, mat);
   MatrixBuildTranslation(temp, center.x + translation.x, center.y - translation.y, 0.0f);
   mat = MatrixMultiply(temp, mat);
   return mat;
  }
 }
}

调用方式:

?
1
2
3
VMatrix matrix = VMatrix.GetSRTMatrix(scale, -m_cur_rotate, center, translation + translationExtra);
m_CRTTexture.material.SetVector("_SRT0", matrix.MatrixGetRow(0));
m_CRTTexture.material.SetVector("_SRT1", matrix.MatrixGetRow(1));

shader使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Properties
{
 _SRT0("PatternSRT0", Vector) = (1, 1, 1, 1)
 _SRT1("PatternSRT1", Vector) = (1, 1, 1, 1)
}
 
Pass
{
 float4 _SRT0;
 float4 _SRT1;
 
 float4 get_pattern_color(float2 uv)
 {
 float2 uv2;
 uv2.x = dot(uv, _SRT0.xy) + _SRT0.w;
 uv2.y = dot(uv, _SRT1.xy) + _SRT1.w;
 return tex2D(_PatternTexture, uv2);
 }
}

感兴趣的可以自己试一试

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_17347313/article/details/107405746

延伸 · 阅读

精彩推荐
  • C#Unity3D自定义创建圆锥体

    Unity3D自定义创建圆锥体

    这篇文章主要为大家详细介绍了Unity3D自定义创建圆锥体,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    hellemic11562022-03-10
  • C#C#中Override关键字和New关键字的用法详解

    C#中Override关键字和New关键字的用法详解

    这篇文章主要介绍了C#中Override关键字和New关键字的用法,需要的朋友可以参考下...

    C#教程网11392021-11-09
  • C#C#学习笔记整理-迭代器模式介绍

    C#学习笔记整理-迭代器模式介绍

    下面小编就为大家分享一篇C#学习笔记整理-迭代器模式介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    可达鸭要进化9432022-02-15
  • C#httpwebreqeust读取httponly的cookie方法

    httpwebreqeust读取httponly的cookie方法

    下面小编就为大家带来一篇httpwebreqeust读取httponly的cookie方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网7652021-12-22
  • C#C#自动类型转换与强制类型转换的讲解

    C#自动类型转换与强制类型转换的讲解

    今天小编就为大家分享一篇关于C#自动类型转换与强制类型转换的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Mogul110362022-03-08
  • C#C#泛型方法在lua中表示的一种设计详解

    C#泛型方法在lua中表示的一种设计详解

    这篇文章主要给大家介绍了关于C#泛型方法在lua中表示的一种设计的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考...

    tiancaiKG5012022-07-11
  • C#C#获取系统当前IE版本号

    C#获取系统当前IE版本号

    这篇文章主要为大家详细介绍了C#获取系统当前IE版本号,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    唐宋元明清21888122022-03-06
  • C#C# 常用协议实现模版及FixedSizeReceiveFilter示例(SuperSocket入门)

    C# 常用协议实现模版及FixedSizeReceiveFilter示例(SuperSocket入门)

    本文主要介绍了常用协议实现模版及FixedSizeReceiveFilter示例。具有很好的参考价值,下面跟着小编一起来看下吧...

    黄昏前黎明后9342021-12-21