Shader中需要数学知识

news2024/11/26 9:41:32

在Shader的学习中,我们可能需要一些数学知识,我也是学习了一段时间,之前数学的知识都忘了,重新来一遍吧,我把学习的点分享一下。

向量:

点乘:
向量A·向量B = A向量的模 * B向量的模 * cosθ
一般用来计算向量夹角cosθ,这里可以看下Lambert (兰伯特)光照模型这篇文章来感受下在Shader中的向量计算

叉乘: 计算两个向量构成平面的法向量

矩阵:

矩阵相乘必须要满足一个规则:第一个矩阵的列数要与第二个矩阵的行数相同。
而得到的结果一定为:行数为第一个矩阵的行数,列数为第二个矩阵的列数。
一个m行n列的向量A与一个n行r列的向量B相乘,得到m行r列的向量C。
在这里插入图片描述
例如矩阵A的维度是3×2,矩阵B的维度是2×4,那么AB的维度就是3×4。如下

在这里插入图片描述

另外还有一个计算技巧:
C23的值是从哪计算得来呢?可以看C23的下标,是由第一个矩阵的第2行 乘以 第二个矩阵的第3列得来
在这里插入图片描述

矩阵乘法的一些性质

  • 性质一:矩阵乘法不满足交换律。
    也就是说,通常情况下:AB≠BA
  • 性质二:矩阵乘法满足结合律。
    (AB)C=A(BC)
    矩阵乘法的结合律可以扩展到更多矩阵的相乘。例如,ABCD=((A(BC))D)=(AB)(CD)

向量与矩阵相乘

一个向量可以用(x,y,z)表示,现在我们让向量与矩阵相乘。
行向量与矩阵相乘:
在这里插入图片描述
列向量与矩阵相乘
在这里插入图片描述

注意:在Unity中,矩阵与向量运算,通常采用列向量右乘

特殊的矩阵

1、方块矩阵

简称方阵,是指那些行和列数目相等的矩阵。在三维渲染里,最常使用的就是3×3和4×4的方阵

2、单位矩阵

一个特殊的对角矩阵是单位矩阵(identity matrix),任何矩阵与它相乘还是原来的矩阵。
在这里插入图片描述
在这里插入图片描述

3、转置矩阵

直接举例:如下图
在这里插入图片描述

4、逆矩阵

不是所有的矩阵都有逆矩阵,该矩阵必须是个方阵。
逆矩阵几何意义:我们可以通过一个矩阵表示一个变换,如何把矩阵还原呢?可以使用逆矩阵来还原这个变换。
例如:
在这里插入图片描述

矩阵变换

线性变换:

满足下面条件的可以称之为线性变换

 f(x)+f(y)=f(x+y)
 kf(x)=f(kx)

在 Unity 中,旋转、缩放为线性变换
对于线性变换来说,对一个三维的矢量进行变换,使用3×3的矩阵就可以表示所有的线性变换

非线性变换:

当然是不满足上面条件了,平移变换属于非线性变换
而对于非线性变换,3x3的矩阵已无法满足,既然三维空间无法满足,那么我用更高纬度的空间,4维空间来实现非线性变换。
使用4x4的矩阵来做非线性变换,我们称之为仿射变换(affine transform)。
把原来的三维矢量转换成四维矢量,这就是我们所说的齐次坐标(homogeneous coordinate)。
齐次坐标:
在这里插入图片描述
对于一个点w 补1,因为点会受到平移变换的影响
对应一个方向向量 w 补0,因为向量不会受平移的影响,不管怎么平移向量是不会变的。

平移矩阵变换。

下面我们来实现平移矩阵变换,来感受一下

假设现在有一个点为(1,2,4),把该点平移(2,1,3),最后的结果是(3,3,7),那么通过矩阵是怎么运算的呢?我们使用齐次坐标空间,由于此处是点的平移那么 w 处补0
在这里插入图片描述
如果现在改为方向向量(1,2,4),平移后方向向量是不变的,还是(1,2,4),此处w补0

在这里插入图片描述

缩放矩阵

在这里插入图片描述

旋转矩阵

沿x轴旋转
在这里插入图片描述
沿y轴旋转
在这里插入图片描述

沿z轴旋转
在这里插入图片描述

复合变换举例

我们把上面的平移缩放旋转来进行复合变换,说的再多,举一个例子可能更直观点。
点A(2,3,4),绕z轴旋转30度,缩放(1,2,3),平移(6,7,8),我们用矩阵来计算下

在这里插入图片描述
矩阵从右往乘,先旋转,再缩放,再平移。由于矩阵相乘满足结合律,我们可以把前面的三个矩阵相乘后得到一个变换矩阵,再于坐标点相乘
在这里插入图片描述

实际应用

在这里我们可以看Unity Shader的一个例子:
在Unity中需要一系列的矩阵变换才能被看到,我们来看看Unity的空间变换。

坐标空间

  • 模型空间:物体的原始数据存储在模型空间下,点是相对于模型空间。
    当一个模型导入到Unity中后,我们可以在顶点着色器中访问到模型的顶点信息,其中包含了每个顶点的坐标。这些坐标都是相对于模型空间中的原点(通常位于模型的重心)定义的。
    在模型空间下我们看不到物体,我们需要把物体先转换到世界空间

  • 世界空间:游戏运行时,把物体加载到场景中,会把点转换到世界空间下

  • 观察空间:摄像机空间,观察空间的原点在摄像机处,把世界空间下的点转换到摄像机的视角空间下。

  • 裁剪空间:到了观察空间,我们依然无法正常显示物体,需要进行下一步变换到裁剪空间,把摄像机外的物体裁剪掉,只有位于摄像机内的物体才会显示。

  • 屏幕空间:在完成上面的操作后,我们需要把点投影到屏幕上,而屏幕时二维空间的显示器,把点投影到屏幕空间中,计算屏幕坐标,显示器才能正常显示。

Shader中相对于的矩阵

1:模型空间 2:世界空间 3:观察空间 4:裁剪空间

  • UNITY_MATRIX_M:从模型空间,转换到世界空间
  • UNITY_MATRIX_V:从世界空间,转换到观察空间
  • UNITY_MATRIX_P:从观察空间,转换到裁剪空间
  • UNITY_MATRIX_MV:从模型空间,到观察空间
  • UNITY_MATRIX_VP:从世界空间,到裁剪空间
  • UNITY_MATRIX_MVP:从模型空间,转换到裁剪空间

直接上图,看的比较清楚
在这里插入图片描述

在顶点着色器中,需要对顶点进行空间变换。假如模型空间下的点A=(2,2,3),向量可以用列矩阵表示。需要把该点转为世界空间下的点,再转为视图空间(我理解的是摄像机的空间),再转为裁剪空间。
UNITY_MATRIX_M x A = 世界空间下的坐标
UNITY_MATRIX_V x 世界空间下的坐标 = 观察空间下的坐标
UNITY_MATRIX_P x 观察空间下的坐标 = 裁剪空间下的坐标

由于矩阵时满足结合律的,上面的空间变换我们可以用一个矩阵来表示UNITY_MATRIX_MVP,UNITY_MATRIX_MVP x A把该点从模型空间转为世界空间

`mul(UNITY_MATRIX_MVP,A)`

在Unity中提供了相应的方法UnityObjectToClipPos,来进行坐标变换

    float4 vert(float4 v:POSITION):SV_POSITION{
                  return UnityObjectToClipPos(v);
                }

一个简单的Shader代码

Shader "My/01 shader"{
         Properties{
 
         }
        SubShader{
            Pass{
                CGPROGRAM

                #pragma vertex vert
                #pragma fragment frag
 				  #include "UnityCG.cginc"
                float4 vert(float4 v:POSITION):SV_POSITION{
                  return UnityObjectToClipPos(v);
                }

                fixed4 frag():SV_Target{
                    return fixed4 (1,1,1,1);
                }
                ENDCG
                }
        }
          FallBack  "Diffuse"
    
    }

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

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

相关文章

深度学习与总结JVM专辑(五):类加载机制

类加载机制前言什么是类加载机制类的生命周期类的加载:查找并加载类的二进制数据链接验证:确保被加载的类的正确性验证?有必要吗准备:为类的静态变量分配内存,并将其初始化为默认值解析:把类中的符号引用转…

ZooKeeper 避坑实践:如何调优 jute.maxbuffer

作者:子葵 背景 在日常运维 ZooKeeper 中,经常会遇到长时间无法选主,恢复时进程启动又退出,进而导致内存暴涨,CPU飙升,GC频繁,影响业务可用性,这些问题有可能和 jute.maxbuffer 的…

Kotlin高仿微信-第17篇-单聊-转账

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

深度学习基础知识回顾

1. Dataset调用了什么接口? 回答应该是__len__方法和__getitem__方法。 之前写过一篇关于Dataset和Dataloader的介绍: http://t.csdn.cn/b4x0hhttp://t.csdn.cn/b4x0h 2. 目标检测里面用了哪些损失函数? 我的回答是Focal Lo…

【Linux】权限讲解

一、什么是权限 1、权限概念 权限随处可见,在生活中,腾讯非VIP用户不能观看VIP视频,看小说也需要会员,所以权限是限制人的,一件事是否允许被谁做。在Linux系统中也有许多权限,访问文件需要权限&#xff0c…

Kafka: Windows环境-单机部署和伪集群、集群部署

1. kafka 单机版部署 1.1 zookeeper 安装 (1)下载安装包 官网:Apache ZooKeeper 我用的是 apache-zookeeper-3.7.1-bin.tar.gz 注意:zookeeper的安装路径不要有中文,建议也不要有空格,比如Program Files这样的路径…

移动跨平台技术方案浅析

随着互联网产品逐渐兴起,越来越多产品体验从线下搬到了线上,尤其是移动互联网产品相关,所以很多企业就会更加重视降本增效,以最快的速度推出质量满意度高、用户体验性好的产品,那么就顺势催生了很多跨端跨平台方案。 …

并发编程九 线程池Executor框架

一 线程 线程是调度CPU资源的最小单位,线程模型分为KLT模型与ULT模型,JVM使用的KLT模型; Java线程与OS线程保持1:1的映射关系,也就是说有一个java线程也会在操作系统里有一个对应的线程。Java线程有多种生命状态 NEW,新建 RUNN…

一文带你深入了解Linux IIO 子系统

【推荐阅读】 一文剖析Linux内核中内存管理 分析linux启动内核源码 关于如何快速学好,学懂Linux内核。内含学习路线 工业场合里面也有大量的模拟量和数字量之间的转换,也就是我们常说的 ADC 和 DAC。而且随着手机、物联网、工业物联网和可穿戴设备的…

[第二十二篇]——Docker 安装 MongoDB

Docker 安装 MongoDB MongoDB 是一个免费的开源跨平台面向文档的 NoSQL 数据库程序。 1、查看可用的 MongoDB 版本 访问 MongoDB 镜像库地址: 。 可以通过 Sort by 查看其他版本的 MongoDB,默认是最新版本 mongo:latest。 你也可以在下拉列表中找到…

高校社团管理系统的设计与实现

摘要 随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在的社团成员可以通过互联网技术就能实现不在学校,在家也可以查看社团信息并能进行申请加入,简单、快捷的方便了社团成员的社交生活。同样的,在人们的工…

【Spring项目中的统一处理异常】

目录 1. 统一处理异常的机制 2. 关于统一处理异常的方法 3. 关于处理异常的方法的执行特点 1. 统一处理异常的机制 Spring MVC框架提供了统一处理异常的机制!表现为每种类型的异常只需要写一段(写一次)处理此异常的代码即可,项…

需求:针对同一个表格多次导入是否要做判断(此项目是用得若依)

每次上传表时,将上传的表名与以往上传的表名做对比,如果相同,则提示表已经有记录,是否上传相同表并结束此方法。 实现思路: 首先,每次上传表都要把表明记录一下,可以新建一个表(数…

天宇优配|离岸人民币狂拉逾千点!中概股暴涨!B站涨22%

当地时间周二,美股三大指数收盘涨跌纷歧。道指涨0.01%,标普500指数跌0.16%,纳指跌0.59%。 抢手中概股领涨,纳斯达克我国金龙指数大涨5.04%,哔哩哔哩(B站)涨超22%。大型科技股多数跌落&#xff0…

小程序中的confirm-type设置键盘的确认按钮

详情: confirm-type是很多小程序组件中的一种设置,用于改变输入键盘右下角的确认按钮。比如说,正常情况下,键盘上的默认提示可能是完成,但是你可以通过confirm-type将其设置为发送,搜索等,在特…

间隔不到一年开两店,温州鸿雁全屋智能经销商透露了他的生意经

作者 | 牧之 编辑 | 小沐 出品 | 智哪儿 zhinaer.cn编者按:间隔不到一年,连续开设了两家全屋智能体验店。这是发生在温州的渠道商故事。本期专访,「智哪儿」对话浙江林上智能科技有限公司总经理朱飞隆先生。他为何做智能家居?为何…

翻转单词序列、按之字形顺序打印二叉树、二叉搜索树的第k个节点

1、翻转单词序列 本题考点:子串划分,子串逆置 牛客链接 题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻…

Python数据库编程之关系数据库API规范

Python关系数据库API规范 对于关系数据库的访问,Python社区已经制定出一个标准,称为Python Database API Specification。Mysql,Oracal等特定数据库模块遵从这一规范,而且可以添加更多特性。 高级数据库API定义了一组用于连接数…

三十六、Java 泛型

Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 假定我们有这…

火山引擎 DataLeap 的 Data Catalog 系统公有云实践

Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据、数据消费者找数和理解数的业务场景。本篇内容源自于火山引擎大数据研发治理套件 DataLeap 中的 Data Catalog 功能模块的实践,主要介绍 Data Catalog 在公有云部署和发布中遇到挑战…