时间:2021-05-19
我们在shader中对贴图处理时,有时候会有一些比较复杂的运算,比方说三角函数,开方等,一般情况下,如果可以在越上层做运算,性能会越高。C#> Vertex > fragment
因此,考虑到贴图的旋转用到的三角函数,可以使用在C#中传入旋转矩阵得到,然后使用uv直接乘以矩阵就可以了。
封装了vmatrix4x4,分享一下:
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; } }}调用方式:
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使用:
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); }}感兴趣的可以自己试一试
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
中文名:坐标矩阵高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。在Android里面,Matrix由9个float值构成,是一个3*3
引言最近在研究Android的变形,Android的2D变形(包括缩放,扭曲,平移,旋转等)可以通过Matrix来实现,3D变形可以通过Camera来实现。接下
本文实例讲述了Android开发实现图片平移、缩放、倒影及旋转功能的方法。分享给大家供大家参考,具体如下:解析:1)根据原来的图片创建新的图片Bitmapmod
本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码:复制代码代码如下:/***使用矩阵控制图片移动、缩放、旋转*/public
在前面实现了平移和缩放,还有一种常用的坐标变换,那就是旋转。比如拍摄的照片上传到电脑里,再打开时发现人的头在下面脚在上,这样肯定看不了,那么就需要把这个照片旋转