我们在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);

}

}

感兴趣的可以自己试一试

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

时间: 2020-07-20

unity 平移图片_unity实现贴图矩阵运算(旋转平移缩放)相关推荐

  1. unity 平移图片_Unity 两张背景的切换平移

    两张背景图片向左移动,当屏幕看见的时候. 使用的是Unity自带的Sprite,当然也可以使用NGUI Sprite using UnityEngine; using System.Collectio ...

  2. Python 读取图,旋转,缩放(PIL, matplotlib)

    Python 读取图,旋转,缩放(PIL, matplotlib) 2017-05-03 12:54 1133人阅读 评论(0) 收藏 举报  分类: python(20)  版权声明:本文为博主原创 ...

  3. Unity实现安卓端手势控制摄像机的旋转和缩放

    说明   上一篇记录了PC端鼠标控制摄像机的移动和缩放,这一篇写的是在安卓机上实现手势控制摄像机围绕一个物体进行旋转和缩放,两篇的代码逻辑基本一样只是输入检测有区别,这里我是分开记录,没有整合[Uni ...

  4. TexturePacker导入unity后图片还是显示成整图

    将资源Sprite Mode 改成Multiple

  5. 【Unity开发小技巧】模型单指旋转双指缩放功能代码(多种情况)

    欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群 1.pc端通过鼠标中键调整相机的FieldOfView属性的值(会发生形变不建议) void Update(){if (Inp ...

  6. Android Studio||动态改变xml图片位置+背景/旋转+平移/AnimationSet/java读取drawable图

    step by step. 目录 参考: 平移(TranslatAnimation) 旋转(RotateAnimation) AnimationSet xml:(正常设置即可) java: java读 ...

  7. Unity图片转换为法线贴图

    Unity图片转换为法线贴图 using UnityEngine; using System.IO; using UnityEditor;public class NormalTexture : Mo ...

  8. unity代码更换ui图片_Unity UI图片的一种优化方式

    项目中使用的不少UI图片是轴对称的,包括:1)横轴对称或纵轴对称 2)同时满足横轴对称和纵轴对称 图1:竖轴对称图片 可以使用镜像效果来节省图片资源.第一种情况可以省下完整资源的一半,第二种情况则可以 ...

  9. Unity ShaderGraph图片发光效果

    Unity ShaderGraph图片发光效果 前言 发光效果(Glow) 原理 ShaderGraph 前言 发光的基本原理,如何给图片施加不同颜色的光 公式讲解部分参考10行代码搞定"热 ...

  10. Unity自定义UI组件(十一) 雷达图、属性图

    前言 借用梦想世界宠物属性图 想必大家都在游戏中见过属性图用于展示多种属性的数值,可以较为直观的对比某种属性的缺陷或者是哪种属性有优势.在三维可视化领域也会遇到类似的属性对比,用属性图来展示最为合适. ...

最新文章

  1. Python argparse
  2. CCF-IFAA基金海外参展 全球安全盛会迎来中国声音
  3. 迷宫问题 POJ - 3984
  4. MySQL(MariaDB)之参数详解(-)
  5. 内核态和用户态的区别
  6. easy html css tree 简单的HTML css导航树
  7. STM32单片机低功耗配置
  8. 计算机组成原理刘红玲,计算机组成原理/21世纪高等学校规划教材
  9. SPA 单页Web应用
  10. go set up on ubuntu
  11. android遥控器用什么测试,Android编程调用红外线遥控功能示例
  12. sublime text编辑器修改python代码的缩进设风格
  13. [机器学习] Ubuntu 软件源更新(校园网)以及问题总结
  14. psv无线怎么连接电脑连接电脑连接服务器,psv如何连接电脑复制视频,音乐,图片等资料教程...
  15. Android stdio报错:“xxx keeps stopping“解决方案
  16. mysql 增量 命令
  17. MATLAB 实现电子版的手写签名
  18. 【100%通过率】华为OD机试真题 Java 实现【完美走位】【2022.11 Q4新题】
  19. vulnhub——Bulldog2
  20. 网络变压器全面叙述(作用,工厂,类型,型号,原理等)

热门文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_5-08 断路器监控仪表参数
  2. BZOJ4318: OSU!
  3. 小D课堂 - 新版本微服务springcloud+Docker教程_4-06 Feign核心源码解读和服务调用方式ribbon和Feign选择...
  4. 牛客NOIP暑期七天营-提高组1 解题报告
  5. (简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
  6. java ee课程目标
  7. eclipse中遇到的小问题
  8. C#弹出窗体、C#导出Excel、C#数据展示框、C#弹出框
  9. Android Studio 创建aar包与引用
  10. estore商城案例(一)------用户注册邮件激活(上)