Unity中Shader平移矩阵

news2024/12/26 23:05:45

文章目录

  • 前言
  • 方式一:对顶点本地空间下的坐标进行相加平移
    • 1、在属性面板定义一个四维变量记录在 xyz 上平移多少。
    • 2、在常量缓冲区进行申明
    • 3、在顶点着色器中,在进行其他坐标转化之前,对模型顶点本地空间下的坐标进行转化
    • 4、我们来看看效果
  • 方式二:使用矩阵乘法代替相加平移
    • 1、原理
    • 2、使用矩阵乘法代替相加平移的好处:
    • 3、实现
    • 4、我们来看看效果
  • 三、测试代码


前言

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


方式一:对顶点本地空间下的坐标进行相加平移

P(x,y,z)
A(x1,y1,z1)
P` = P + A =(x + x1,y + y1,z + z1)

1、在属性面板定义一个四维变量记录在 xyz 上平移多少。

_Translate(“Translate(XYZ)”,Vector) = (0,0,0,0)

2、在常量缓冲区进行申明

CBUFFER_START(UnityPerMaterial)
float4 _Translate;
CBUFFER_END

3、在顶点着色器中,在进行其他坐标转化之前,对模型顶点本地空间下的坐标进行转化

v.vertexOS += _Translate.xyz;

4、我们来看看效果

请添加图片描述


方式二:使用矩阵乘法代替相加平移

1、原理

  • 我们按照如下格式得到平移矩阵
    Translate(a,b,c)

在这里插入图片描述

  • 我们给P点的坐标增加一维且值为1,作为列矩阵

在这里插入图片描述

  • 最后,我们让两个矩阵相乘就会得到一个包含平移后结果。
    但是,多出一维分量值为1的列矩阵。

在这里插入图片描述

  • 我们在图形计算器看看效果

请添加图片描述

2、使用矩阵乘法代替相加平移的好处:

在多种图形变换时,我们可以把多次的图形变换合并到一个矩阵中。
最后,对顶点只进行一次计算就可得出所有变换后的结果。

3、实现

  1. 在属性面板定义一个四维变量记录在 xyz 上平移多少。

_Translate(“Translate(XYZ)”,Vector) = (0,0,0,0)

  1. 在常量缓冲区进行申明

CBUFFER_START(UnityPerMaterial)
float4 _Translate;
CBUFFER_END

  1. 在顶点着色器中,定义平移矩阵
float4x4 T = float4x4
                (
                    1,0,0,_Translate.x,
                    0,1,0,_Translate.y,
                    0,0,1,_Translate.z,
                    0,0,0,1
                );
  1. 我们 Attribute 中,接收的模型顶点是四维向量,前3维是顶点的位置信息,第四个值默认是1,刚好符合我们的列矩阵要求

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

对于mul函数(我们这里默认使用了第一种相乘方法):

  • OpenGL(图形接口): 按列存储矩阵(column-major)。调用API形成的矩阵用来和一个列向量相乘,矩阵在左,列向量在右,即mul(M,v)

  • GLSL(着色器语言):  矩阵的存储方式和OpenGL相同(column-major)

  • DirectX(图形接口): 按行存储矩阵(row-major)。调用API形成的矩阵用来和一个行向量相乘,矩阵在右,行向量在左,即mul(v, M)

  • HLSL(着色器语言): 矩阵存储方式和DirectX相反(column-major)

4、我们来看看效果

请添加图片描述


三、测试代码

//平移变换
Shader "Unlit/P3_5_1"
{
    Properties
    {
        _Translate("Translate(XYZ)",Vector) = (0,0,0,0)
    }
    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;
            CBUFFER_END
            Varying vert (Attribute v)
            {
                Varying o;
                float4x4 T = float4x4
                (
                    1,0,0,_Translate.x,
                    0,1,0,_Translate.y,
                    0,0,1,_Translate.z,
                    0,0,0,1
                );
                
                v.vertexOS = mul(T,v.vertexOS);
                o.vertexCS = TransformObjectToHClip(v.vertexOS.xyz);
                return o;
            }

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

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

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

相关文章

NIO的实战教程(简单且高效)

1. 参考 建议按顺序阅读以下三篇文章 为什么NIO被称为同步非阻塞? Java IO 与 NIO:高效的输入输出操作探究 【Java.NIO】Selector,及SelectionKey 2. 实战 我们将模拟一个简单的HTTP服务器,它将响应客户端请求并返回一个固定的…

​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进

在当今数字化浪潮愈发汹涌的时代,科技公司的发展不仅需要更强大的计算能力和创新性技术,还需要对环境的高度责任感。在这一背景下,亚马逊云科技的海外服务器产品成为了推动清洁、高效数字未来的领导者之一。亚马逊云科技的高级主管阿比谢克夏…

【MyBatis学习笔记】MyBatis基础学习

MyBatis基础 MyBatis简介MyBatis特性MyBatis下载和其他持久化层技术对比 核心配置文件详解默认的类型别名 搭建MyBatis开发环境创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件通过junit测试功能加入log4j日志功能 MyBatis获取参数值的两种方式&am…

vue-pure-admin源码解读与使用

vue-pure-admin 全面使用ESMVue3ViteElement-PlusTypeScript编写的一款后台管理系统(兼容移动端),目前斩获11.5k个star。 界面构成 主题Layout的组成 左边sidebar由Vertical组件定义tab标签栏由layoutHeader组件定义中间Body由appMain组件定义 为何点…

@RequestParam、@PathVariable、@RequestBody、@RequestAttribute详解

一、RequestParam注解 作用:用于将指定的请求参数赋值给方法中的形参。 属性: 1)value:请求参数名(必须配置) 2)required:是否必需,默认为 true,即请求中必须…

GESP认证第四次考试百分榜考生名单及学校

考生姓名 所在学校 编程语言 得分 谢秉修 上海市民办华育中学 C 八级 100 张洪森 淄博市张店区第八中学 C 四级 100 高希文 宜兴市实验中学 C 四级 100 窦铭泽 温州市实验中学教育集团府东分校 C 四级 100 袁…

浅析 fuse kernel mmap write 过程及性能问题

前言 最近在项目里面用到了fuse文件系统,在使用过程中遇到了一个内核在做mmap write的一个bug,目前并没有从根本上解决这个bug,而是通过修改fuse kernel module的一些参数,绕开了这个bug。这里记录一下这个问题,并顺便…

学会这个插件,职业生涯少写 1w 行代码。

前言 学会这个插件,职业生涯少写 1w 行代码。 与前端对接、与后端对接、与数据对接、与第三方对接等等。这些工作发生在大家的整个工作周期中,其中有些工作都是重复性的,而且是机械的。 所以今天给大家推荐一款非常实用 IDEA 插件&#xf…

【Python】基于ORM的SqlAlchemy操纵数据库代码实现

说明 ORM,全称Object-Relational Mapping,即对象-关系映射,是一种程序设计技术,用于在面向对象编程语言和关系数据库之间建立对应关系。它的主要目的是让开发者能够使用面向对象的方式操作数据库,而不必过多地关注数据…

法线贴图实现地形模型皱褶、凹凸不平的纹理效果

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 法线贴图在3D建模中扮演着重要的角色,它通过模拟表面的微…

Qt 国际化——创建中英文翻译步骤

Qt 国际化——创建中英文翻译步骤 说明:之前我的csdn博客,第一篇文章发表的就是Qt国际化的文章(点击打开),写的也过于简单了: 今天,这篇文章再详细的记录下,中英文翻译的步骤。 一…

2024年区块链发展趋势

在快节奏的技术领域,区块链生态系统是创新的灯塔,不断发展和塑造数字景观。当我们迈入2024年时,必须通过了解关键的区块链发展趋势来保持领先地位,这些趋势将重新定义方式我们与去中心化系统交互。 1、互操作性:弥合区…

Day67力扣打卡

打卡记录 美丽塔 II(前缀和 单调栈) 链接 class Solution:def maximumSumOfHeights(self, maxHeights: List[int]) -> int:n len(maxHeights)stack collections.deque()pre, suf [0] * n, [0] * nfor i in range(n):while stack and maxHeights…

蔡司光学为山区孩子送光明,照亮未来之路

本月13日,蔡司光学携手德兴市科学技术协会、江西明眸贸易有限公司、德兴市妇幼保健院及德兴温视堂眼视中心,在江西上饶德兴市昄大学校内举办了“为边远山区孩子送光明”活动,在寒冷冬日为偏远山区的孩子送去冬日温暖,以公益之力照…

【中小型企业网络实战案例 一】规划、需求和基本配置

热门IT技术【视频教程】https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 案例拓扑图 案例需求 在中小园区中,S5735通常部署在网络的接入层,S8700通常部署在网络的核心,出口路由器一般选用AR系列路由器。 …

SQL进阶理论篇(十七):数据库主从同步的原理

文章目录 简介为什么需要主从同步主从同步的原理总结参考文献 简介 以MySQL数据库为例,在实际生产中,我们会如何对MySQL数据库进行性能优化呢? 比如说配合上Redis做缓存。Redis是一种高性能的内存数据库,而MySQL是一种基于磁盘文…

C# 使用MSTest进行单元测试

目录 写在前面 代码实现 执行结果 写在前面 MSTest是微软官方提供的.NET平台下的单元测试框架;可使用DataRow属性来指定数据,驱动测试用例所用到的值,连续对每个数据化进行运行测试,也可以使用DynamicData 属性来指定数据&…

计算机网络(4):网络层

网络层提供的两种服务 虚电路服务(Virtual Circuit Service)和数据报服务(Datagram Service)是在网络层(第三层)提供的两种不同的通信服务。它们主要区别在于建立连接的方式和数据传输的方式。 虚电路服务…

[图像和LiDAR点云的可微分配准]

文章目录 概要主要贡献内容概述实验小结 概要 不同模态之间的配准,例如来自摄像机的2D图像和LiDAR的3D点云之间的配准,是计算机视觉和机器人领域中至关重要的任务。 以往的方法通常通过匹配神经网络学习到的点和像素模式来估计2D-3D对应关系&#xff0…

听GPT 讲Rust源代码--src/tools(15)

File: rust/src/tools/rust-analyzer/crates/mbe/src/token_map.rs 在Rust源代码中,rust/src/tools/rust-analyzer/crates/mbe/src/token_map.rs文件的作用是实现了一个能够将输入的文本映射为标记的结构。具体来说,它定义和实现了几个结构体&#xff08…