Unity中Shader缩放矩阵

news2025/1/18 9:04:35

文章目录

  • 前言
  • 一、直接相乘缩放
    • 1、在属性面板定义一个四维变量,用xyz分别控制在xyz轴上的缩放
    • 2、在常量缓存区申明该变量
    • 3、在顶点着色器对其进行相乘,来缩放变换
    • 4、我们来看看效果
  • 二、使用矩阵乘法代替直接相乘缩放的原理
    • 1、我们按如下格式得到缩放矩阵
    • 2、把我们需要平移的点变为列矩阵
    • 3、M~scale~* P 得到缩放变换后的结果
    • 4、我们在图形计算器中看看效果
  • 三、在URP Shader中实现
    • 1、在属性面板定义一个四维变量,用xyz分别控制在xyz轴上的缩放
    • 2、在常量缓存区申明该变量
    • 3、在顶点着色器中得到缩放矩阵
    • 4、因为Attribute接收顶点格式为(x,y,z,1)且mul相乘规则的原因。所以,我们的列矩阵就是 vertexOS
    • 5、相乘得到结果
    • 6、我们来看看效果
  • 四、测试代码


前言

在Shader中,我们对于顶点经常使用到缩放变换。我们在这篇文章中,用点的缩放看一下缩放变换的缩放矩阵。


一、直接相乘缩放

P1 = P*S
P1 = (Px * Sx,Py * Sy,Pz * Sz)

请添加图片描述

1、在属性面板定义一个四维变量,用xyz分别控制在xyz轴上的缩放

_Scale(“Scale(XYZ)”,Vector)= (1,1,1,1)

2、在常量缓存区申明该变量

CBUFFER_START(UnityPerMaterial)
float4 _Scale;
CBUFFER_END

3、在顶点着色器对其进行相乘,来缩放变换

v.vertexOS *= _Scale;

4、我们来看看效果

请添加图片描述


二、使用矩阵乘法代替直接相乘缩放的原理

1、我们按如下格式得到缩放矩阵

扩维到四维的原因:因为平移矩阵是4维的,使缩放矩阵变成同一维度,在之后可以合并变换矩阵

  • Scale(a,b,c)
    在这里插入图片描述

2、把我们需要平移的点变为列矩阵

  • P(x,y,z)
    在这里插入图片描述

3、Mscale* P 得到缩放变换后的结果

在这里插入图片描述

4、我们在图形计算器中看看效果

请添加图片描述


三、在URP Shader中实现

1、在属性面板定义一个四维变量,用xyz分别控制在xyz轴上的缩放

_Scale(“Scale(XYZ)”,Vector)= (1,1,1,1)

2、在常量缓存区申明该变量

CBUFFER_START(UnityPerMaterial)
float4 _Scale;
CBUFFER_END

3、在顶点着色器中得到缩放矩阵

float4x4 M_Scale = float4x4
(
_Scale.x,0,0,0,
0,_Scale.y,0,0,
0,0,_Scale.z,0,
0,0,0,1
);

4、因为Attribute接收顶点格式为(x,y,z,1)且mul相乘规则的原因。所以,我们的列矩阵就是 vertexOS

5、相乘得到结果

v.vertexOS = mul(M_Scale,v.vertexOS);

6、我们来看看效果

请添加图片描述


四、测试代码

//平移变换
Shader "MyShader/URP/P3_5_3"
{
    Properties
    {
        _Translate("Translate(XYZ)",Vector) = (0,0,0,0)
        _Scale("Scale(XYZ)",Vector)= (1,1,1,1)
    }
    SubShader
    {
        Tags
        {
            "PenderPipeline"="UniversalPipeline"
            "RenderType"="Opaque"
            "Queue"="Geometry"
        }
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            struct Attribute
            {
                float4 vertexOS : POSITION;
            };

            struct Varying
            {
                float4 vertexCS : SV_POSITION;
            };

            CBUFFER_START(UnityPerMaterial)
            float4 _Translate;
            float4 _Scale;
            CBUFFER_END
            Varying vert (Attribute v)
            {
                Varying o;
                //平移变换
                float4x4 M_Translate = float4x4
                    (
                    1,0,0,_Translate.x,
                    0,1,0,_Translate.y,
                    0,0,1,_Translate.z,
                    0,0,0,1
                    );
                v.vertexOS = mul(M_Translate,v.vertexOS);
                //缩放交换
                float4x4 M_Scale = float4x4
                    (
                    _Scale.x,0,0,0,
                    0,_Scale.y,0,0,
                    0,0,_Scale.z,0,
                    0,0,0,1
                    );
                v.vertexOS = mul(M_Scale,v.vertexOS);
                o.vertexCS = TransformObjectToHClip(v.vertexOS.xyz);
                return o;
            }

            half4 frag (Varying i) : SV_Target
            {
                return 1;
            }
            ENDHLSL
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1331251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

作者:索增增(小红书)、宋泽辉(小红书)、张佐玮(阿里云) 背景介绍 Koordinator 是一个开源项目,基于阿里巴巴在容器调度领域多年累积的经验孵化诞生,目前已经支持了 K8s…

LZ码基本概念

LZ码是一种无损压缩算法,由Lempel和Ziv两位计算机科学家提出并命名。它是一种基于字典的压缩方法,可以将数据有效地压缩存储,同时实现高效的解压缩。 LZ码的基本概念是利用字典来存储先前遇到的字符串,然后用较短的代表符号来表示…

【性能优化】MySql数据库查询优化方案

阅读本文你的收获 了解系统运行效率提升的整体解决思路和方向学会MySQl中进行数据库查询优化的步骤学会看慢查询、执行计划、进行性能分析、调优 一、问题:如果你的系统运行很慢,你有什么解决方案? ​关于这个问题,我们通常首先…

mac上使用 Downie 下载网页视频

在今天的数字时代,视频内容在互联网上的传播变得更加普遍和便捷。然而,有时我们可能希望将网页上的视频保存在本地,以便离线观看或与他人分享。Downie 是一款强大而简便的工具,专门设计用于下载网页上的视频内容。本文将介绍 Down…

IP技术在网络安全防护中的重要意义

随着互联网的普及,网络安全问题日益凸显。作为网络通信中的重要标识,IP地址在网络安全防护中扮演着关键角色。近日,一则关于IP技术在网络安全防护措施的新闻引起了广泛关注。 据报道,IP技术已成为网络安全防护的重要手段之一。通过…

idea structure视图介绍

作用 idea的Structure视图可以辅助查看代码结构 如何呼出Structure视图? Alt 7 Ctrl F12 侧边栏点Structure 我的常用配置 1、选Show Toolbar,便于使用功能按钮 2、使用Float视图,悬浮于窗口表面,可以使用 ShiftEsc来退出…

学习使用echarts图表中formatter的用法,格式化数字金额,控制x轴、y轴展示长度

学习使用echarts图表中formatter的用法,格式化数字金额,控制x轴、y轴展示长度 控制金额长度两位小数,并去除多余.00效果图 控制文字长度完整代码 控制金额长度 series: [{name: ,type: bar,sort: none,label: { //饼图图形上的文本…

DFS与BFS算法总结

知识概览 DFS、BFS都可以对整个问题空间进行搜索,搜索的结构都是像一棵树。DFS会尽可能往深搜,当搜索到叶节点时就会回溯。而BFS每一次只会扩展一层。 DFS与BFS的区别: 搜索方式数据结构空间复杂度性质DFS栈O(h),其中h为搜索空间…

Linux数据库主从复制(单主单从)

MySQL主从复制的优点包括: 1、横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新…

PMP项目管理 - 成本管理

系列文章目录 系统架构设计 PMP项目管理 - 整合管理 PMP项目管理 - 范围管理 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 PMP项目管理 - 沟通管理 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞…

只用10分钟,ChatGPT就帮我写了一篇2000字文章

有了ChatGPT之后,于我来说,有两个十分明显的变化: 1. 人变的更懒 因为生活、工作中遇到大大小小的事情,都可以直接找ChatGPT来寻求答案。 2. 工作产出量更大 之前花一天,甚至更久才能写一篇原创内容,现…

FPGA设计时序约束十三、Set_Data_Check

目录 一、序言 二、Set Data Check 2.1 基本概念 2.2 设置界面 2.3 命令语法 三、工程示例 3.1 工程代码 3.2 约束设置 3.3 时序报告 四、参考资料 一、序言 通常进行时序分析时,会考虑触发器上时钟信号与数据信号到达的先后关系,从而进行setu…

模块与包、反序列化校验源码分析、断言、drf之请求、drf之响应

模块与包 什么是模块? 一个py文件,被别的py文件导入使用,它就是模块 如果py文件,直接右键运行,它叫脚本文件 什么是包? 一个文件夹,下有 __init__.py ,和很多py文件,这个…

C++面向对象(OOP)编程-STL详解(vector)

本文主要介绍STL六大组件,并主要介绍一些容器的使用。 目录 1 泛型编程 2 CSTL 3 STL 六大组件 4 容器 4.1 顺序性容器 4.1.1 顺序性容器的使用场景 4.2 关联式容器 4.2.1 关联式容器的使用场景 4.3 容器适配器 4.3.1 容器适配器的使用场景 5 具体容器的…

XSKY星辰天合星海架构荣获 IT168 “2023 年度技术卓越奖”

近日,"2023 年度技术卓越奖"获奖名单公布,XSKY 星辰天合的星海架构(XSEA,极速全共享架构)获得行业 CIO/CTO 大咖、技术专家及 IT 媒体三方认可,成功入选! “技术卓越奖”评选由国内著…

如何查看内存卡使用记录-查看的设备有:U盘、移动硬盘、MP3、SD卡等-供大家学习研究参考

主要功能 USB Viewer(USB移动存储设备使用记录查看器)可用于查看本机的USB移动存储设备使用记录。可查看的设备有:U盘、移动硬盘、MP3、SD卡……等。   可用于兵器、航空、航天、政府、军队等对保密要求较高的单位,可在计算机保…

Proxmox VE 超融合集群不停服务新增配置(磁盘)

五个节点的Proxmox VE超融合集群,创建了两个Ceph Pool,一个是高速的Nvme存储池,另一个是大容量SATA存储池。现在需要将原有的SATA磁盘全部拔出来,换成高速Nvme磁盘。 ​ ​ 首先,先销毁由SATA机械盘组成的“hdd_pool”&#xff…

Bwapp学习笔记

1.基本sql语句 #求绝对值 select abs(-1) from dual; #取余数 select mod(10,3); #验证show databases结果是取之于schemata表的 show databases; select schema_name from information_schema.schemata; #查询当前的数据库 select database(); -- 查询数据库版本 s…

前端学习——指令

vue作为前端框架,为了简化或实现一些特定功能,提供了很多指令,那什么是指令呢? 所谓的指令就是能够完成特定功能的一些vue语法,比如属性绑定指令v-bind,事件绑定指令v-on,循环指令v-for等。在v…

题目基础算法蓝桥真题

真题《空间》 内容提取&#xff1a;1个字节等于8个比特 32位二进制中为32bits4Bytes&#xff0c;题目里的256MB256*2**20Bytes 所以化完单位后直接相除等于64*2**20Bytes。 代码 其中2的20次方可以用(1<<20)表示 蓝桥杯中一般不用pow函数有误差或时间长 endl也不用…