冯乐乐之二 shader的数学

2023-10-30

冯乐乐目录

第2章渲染流水线介绍

第三章 Unity shader基础

基础shaderLab语言,shader结构,属性properties,主角SubShader,备胎Fallback。

shader三大类型:

Unity宠儿表面着色器,聪明boy顶点片元着色器,弃子固定函数着色器。

 

第四章 数学

笛卡尔坐标系=直角坐标系

点和矢量,点乘叉乘。

矩阵

矩阵乘法:r*n矩阵A 乘以n*c矩阵B,得到r*c矩阵AB

满足结合律不满足交换律AB != BA, (AB)C = A(BC)

特殊矩阵:

方块矩阵

方阵(行列相等)

单位矩阵I

(行列相等且对角线为1)MI = IM = M

转置矩阵

r*c矩阵c*r矩阵Mt,Mtt = M,(AB)t = BtAt

对称矩阵

对称矩阵的转置等于本身 M = Mt

逆矩阵:最复杂的矩阵操作

M-1,MM-1 = M-1M = I

只有方阵有逆矩阵,不是所有方阵都有逆矩阵,如果一个矩阵的行列式不为0,则此矩阵是可逆的。

性质1:M-1-1 = M;性质2:I-1 = I;性质3:Mt-1 = M-1t;性质4:AB-1 = B-1A-1

逆矩阵的几何性质,逆矩阵可以表示逆变换。

正交矩阵

如果一个方阵M和他的转置矩阵Mt的乘积为单位矩阵的话,则说此方阵是正交的。

MMt = MtM = I

看到上面很容易联想到MM-1 = M-1M = I

所以正交矩阵最大特点M-1 = Mt,性质:M是正交矩阵,则Mt也是正交矩阵。

正交的应用:由于求解逆矩阵的运算量巨大,使用正交矩阵的转置来代替逆矩阵可以大幅减少运算量。

如何快速判断正交矩阵,而不使用MtM = I判断。

结论:就是3*3矩阵的三行或者三列是一组,标准正交向量基c1c2c3,即三个相互垂直的向量且长度为1。

[c1c2c3]or[c1c2c3]t,单位矩阵一定是正交矩阵。

向量转换成行矩阵还是列矩阵?

 

矩阵的几何意义

向量的线性变换满足2个条件:1.f(x) + f(y) = f(x+y) 2.kf(x) = f(kx)

缩放f(v) = 2v和旋转(难以函数表示)是线性变换,可以用3*3矩阵表示所有的线性变换。

但是非常遗憾,最常见的平移变换居然不是线性变换, 如f(v) = v + (1,1,1);

于是发明仿射变换(affine transform),4*4矩阵表示,相当于合并一个线性变换和一个平移变换。

为了乘4*4矩阵,向量也要拓展到四维,此四维称齐次坐标空间(homogeneous space)。

 

齐次坐标

向量升四维,添加w分量,如果是坐标向量w = 1,如果是方向向量则w = 0。

这样做的目的是,方向向量的平移效果会被忽略(向量平移是无意义的)。

4*4矩阵表示为

[M3*3, t3*1]

[01*3, 1     ]

M3*3为旋转缩放变换,t3*1为平移变换,01*3为零向量,1为标量。

平移矩阵

平移矩阵*坐标向量的列向量。方向向量不能平移,相乘是没有效果的。

显然上述逆矩阵为

因为M-1 != Mt,所以平移矩阵不是正交矩阵。

缩放矩阵

缩放坐标向量和方向向量都是ok的

逆矩阵

不是正交矩阵

旋转矩阵

绕x,y,z旋转的矩阵如下

全部是正交矩阵,多个旋转矩阵串联也是正交矩阵

复合变换

将缩放,旋转,平移三合一,注意顺序不能变化,这是本书约定。

 

五大坐标空间

如何实现变换(重点内容暂时跳过)

模型空间 modelSpace= 对象空间object = 局部空间local,建模软件中确定的。

世界空间,worldSPace代理绝对位置,Scene中transform的position。Unity决定。

顶点坐标从模型空间,变换到世界空间,这一步叫做模型变换ModelTransform。

观察空间 viewSpace= 摄像机空间CameraSpace,unity中摄像机的模型空间,e.g.正前方是-z轴,也是唯一一个右手坐标系空间。

观察空间是三维的,而屏幕空间是二维的。

世界空间变换到观察空间称观察变换ViewTransform,观察空间转屏幕空间称Projection。

裁剪空间clipSpace = 齐次裁剪空间(齐次就是四维),观察空间转屏幕空间称Projection,观察空间转屏幕空间称投影矩阵。

此空间是有边界的,由远近裁剪平面决定,投影方式:正交投影,透视投影。

投影矩阵并不是真正的投影工作,而是为裁剪判断做准备,齐次坐标左乘裁剪矩阵之后,得到裁剪空间坐标(x,y,z,w),其中的w分量不再是0或1,而是用于裁剪判断的值,如果x,y,z的绝对值小于w的绝对值,则该点不会被裁剪。

屏幕空间

唯一一个二维空间,现在将裁剪空间下的顶点坐标投影到屏幕空间。

投影矩阵变换之后,可以进行裁剪,完成裁剪之后可以进行正在的投影。上文中裁剪空间也叫投影但是只是投影之前的准备。

使用标准齐次除法(homogeneous division)也称透视除法(perspective division),即w分离除以x,y,z分量,除法之后得到的三维坐标称归一化设备坐标(Normalized Device Coordinates,NDC)。是一个范围[-1,1]的立方体空间。

 

特殊的变换:法线变换

问题,在变换顶点的同时,需要变换顶点法线N,但是使用相同的矩阵变化,并不能保证法线的垂直。

与法线对应的切矢量T由顶点位置插值得到,所以使用同样的矩阵变化也不影响与面在同一平面的特性。

我们可以使用切线来约束法线,因为切线和法线总是垂直。

结论:经过推导,如果顶点的变换矩阵为M,则使用原矩阵的逆转置矩阵可以完成上述目标(M-1)t,

值得注意,当原矩阵为正交矩阵时,法线变换矩阵和顶点变换矩阵相同。

 

Unity内置变量

Unity内置变换矩阵,相机与屏幕参数

英文页:https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html

中文页:https://docs.unity.cn/cn/current/Manual/SL-UnityShaderVariables.html

隔壁大哥对所有可能用到的函数和变量的总结:

https://blog.csdn.net/y90o08u28/article/details/88027031

 

以上

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

冯乐乐之二 shader的数学 的相关文章

  • Android 中图像的填充图案

    下面给出了两个图像 我将第一个图像称为帧图像 将第二个图像称为帧图像 这里 fst 是我的线性布局 我将帧图像设置为它的背景图像 现在我想在帧图像的白色区域中填充图案图像 帧图像的外部区域是透明的 内部区域是白色的 我如何在我的框架图像中填
  • 矩阵基本操作

    问题描述 已知一个n n的矩阵 方阵n lt 100 把矩阵主副对角线上的元素值加上x 然后输出这个新矩阵 输入格式 一行两个变量 用空格隔开 代表n和x 接下来的n行每行n列 表示矩阵的数值 用空格隔开 输出格式 输出新矩阵 每个数字5个
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 为 webgl 中的每个对象使用不同的顶点和片段着色器

    我在 webgl 中有一个包含多个对象的场景 对于每个对象 我想使用不同的顶点和片段着色器 我的第一个问题是 是否可以为每个对象都有一个着色器 我知道在 opengl 中这是可能的 这是与我的想法类似的伪代码 任何例子将不胜感激 glena
  • 5_机械臂运动学基础_矩阵

    上次说的向量空间是为矩阵服务的 1 学科回顾 从科技实践中来的数学问题无非分为两类 一类是线性问题 一类是非线性问题 线性问题是研究最久 理论最完善的 而非线性问题则可以在一定基础上转化为线性问题求解 线性变换 数域 F 上线性空间V中的变
  • Unity3D Sprite ...但是单面的?

    团结优秀Sprites Unity优秀的新精灵 http docs unity3d com ScriptReference Sprite html 除其他有价值的优点外 实际上是双面的 在 2D 或 3D 用例中 您可以翻转这些小混蛋 但仍
  • Unity3D - 用于精灵裁剪的着色器

    我正在尝试创建一个可用于在游戏中剪辑 2D 精灵的着色器 我在中找到了该着色器另一个问题 https stackoverflow com questions 16397023 unity3d a shader that will clip
  • 线性光模式的 Alpha 混合层

    我正在重新创建一些 Photoshop 混合 并尝试使用线性光模式 在 Photoshop 中 您将有一个不透明度为 100 的背景图层 然后是一个不透明度为 50 的顶层 其混合模式设置为 线性光 我确实找到了有关如何进行线性光混合的信息
  • 如何将shadershop公式转换成glsl

    我最近一直在学习着色器的一些基础知识 并且想出了一个很棒的视觉工具 着色器商店 http www cdglabs org Shadershop 但我无法将我在此站点中创建的公式转换为 glsl 一个简单的例子 我在此网站中创建了一个公式 我
  • glUseProgram(0) 的作用是什么?

    OpenGL 文档为glUseProgram https www khronos org registry OpenGL Refpages gl4 html glUseProgram xhtml声称用参数调用它zero将导致着色器执行的结果
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • OpenGL - 固定管线着色器默认值(使用着色器模仿固定管线)

    谁能给我提供类似于固定功能管道的着色器 我最需要默认的片段着色器 因为我在网上找到了类似的顶点着色器 但如果你有一双应该没问题 我想使用固定管道 但具有着色器的灵活性 因此我需要类似的着色器 以便我能够模仿固定管道的功能 非常感谢 我是新来
  • OpenGL ES 2.0 多个程序或多着色器还是什么?它是如何工作的?

    问题 TL DR 我的问题从根本上来说是我不知道 OpenGL ES 2 0 期望我如何编写和使用多个着色器 或者如果甚至建议 期望一个人会这样做 这里的基本问题是 如果我有一个苹果 一块发光的岩石和一个模糊网格 它们都在同一个 3D 世界
  • 如何使用鼠标改变OpenGL相机

    我正在尝试在 OpenGL 中设置一个相机来查看 3 维中的一些点 为了实现这一点 我不想使用旧的 固定的功能样式 glMatrixMode glTranslate 等 而是自己设置模型视图投影矩阵并在我的顶点着色器中使用它 正交投影就足够
  • 您应该如何有效地批处理复杂的网格?

    渲染复杂网格的最佳方法是什么 我在下面写了不同的解决方案 想知道您对它们有何看法 让我们举个例子 如何渲染 Crytek Sponza 网格 PS 我不使用Ubershader 只使用单独的着色器 如果您通过以下链接下载网格 http gr
  • 编写每个三角形/面具有纯色的 GLSL 片段着色器的方法

    我有顶点和三角形数据 其中包含每个数据的颜色triangle 面 不是每个顶点 即单个顶点由多个面共享 每个面可能具有不同的颜色 我应该如何在 GLSL 中解决这个问题以获得每个的纯色分配face正在渲染 通过平均顶点相邻多边形的颜色来计算
  • DirectX 世界视图矩阵乘法 - GPU 或 CPU 的地方

    我是 directx 的新手 但令我惊讶的是 我看到的大多数示例中 世界矩阵和视图矩阵都是作为顶点着色器的一部分相乘 而不是与 CPU 相乘并将结果传递给着色器 对于刚性对象 这意味着您为对象的每个顶点将相同的两个矩阵相乘一次 我知道 GP
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • GLSL 中统一浮点行为和常量浮点行为的不同

    我正在尝试在 GLSL 中实现模拟双精度 并且观察到一种奇怪的行为差异 导致 GLSL 中出现细微的浮点错误 考虑以下片段着色器 写入 4 浮点纹理以打印输出 layout location 0 out vec4 Output unifor
  • 与整数纹理进行 Alpha 混合以进行对象拾取

    问题描述 你好 在我们的 WebGL 应用程序中 我们正在绘制许多 甚至数十万 形状 并且我们想要发现当前鼠标位于哪个形状 我正在寻找一种有效的方法 Details 形状定义为有符号距离函数 https en wikipedia org w

随机推荐

  • Secrets of RLHF in Large Language Models Part I: PPO

    本文是LLM系列文章 针对 Secrets of RLHF in Large Language Models Part I PPO 的翻译 大型语言模型中RLHF的秘密 上 PPO 摘要 1 引言 2 相关工作 3 人类反馈的强化学习 4
  • 高端技能之教你学会iOS抓包以及Fiddler抓包软件的用法

    软件安装包在最下面 安装fiddler 一路无脑选是 配置 Tools gt Options 第一步 勾选Https Decrypt用于将网页的密文包解为明文包 第二步 勾选Allow的意思是允许手机手动代理之后可以连接 第三步 记住端口号
  • 座舱开发的“道”与“术”

    前言 近年来 随着汽车 新四化 浪潮的兴起 软件定义已成为产业共识 将深度参与到整个汽车的定义 开发验证销售以及服务全过程 一方面确保软件可升级 跨车型 软件甚至跨车企软件重用 另一方面对于硬来讲 要做到可扩展 可更换 甚至做到传感器的即插
  • 单词接龙

    单词接龙 是指一组单词序列 任何两个相邻的单词满足前一个单词的尾字母和后一个单词的首字母相同 接龙长度 接龙中所有单词长度之和 如单词 tea cat dog aid fish 可以形成单词接龙 cat tea aid dog 其中cat为
  • [转]Project2010简易操作指南

    本文转自 http ce sysu edu cn hope Item aspx id 68176 一 启动阶段 1 前期准备 1 新建项目文件 选择 File NewNew 菜单 选择项目模版 打开项目文件 看见任务表格后设定任务自动排期
  • 网络地址不在同一网段能通信吗

    ip地址不一样的主机只要是在同一个网段就可以直接通信 如果在同一网段IP地址相同就冲突了 如果是不同的网段 而且不能通过掩码使其在一个大网段里 那么是不可以直接通信的 在同一网段可以直接通信是通过广播传输的 如果不通网段的话 广播包就过不去
  • Signoff Criteria --- ocv/aocv/pocv之POCV介绍

    POCV parametric on chip variation 本小节介绍pocv相关内容 1 Overview Process variation可以简单分成die to die和on chip variation ocv die t
  • 四级高频词汇360个

    英语四级高频词汇如下 1 alter v 改变 改动 变更 2 burst vi n 突然发生 爆裂 3 dispose vi 除掉 处置 解决 处理 of 4 blast n 爆炸 气流 vi 炸 炸掉 5 consume v 消耗 耗尽
  • 网络攻防WEB入门指南

    网络攻防WEB入门指南 大佬绕路 文章目录 前言 学习网络攻防该如何入门 前言 我对网络攻防的理解 分为比赛和实战两个部分 两者所学习的知识虽有共通之处 但还是有很大区别 我也在向实战的状态转换 不过二者入门所要掌握的知识差别不大 下面主要
  • 判断是否为子序列

    两个整数序列A a1 a2 a3 am和B b1 b2 b3 bn已存入两个单链表中 设计一个算法 判断 序列B是否是序列A的连续子序列 include
  • React中高阶组件应用

    高阶组件 函数传入一个组件 返回一个新的组件 1 高阶组件的运用 在不破坏原本的结构的时候 利用高阶组件进行加工 如下 如果要在Home组件以及About组件再传入region 中国 就需要两个都修改 class App extends P
  • 【面经——欢聚集团 一面】

    2021年4月8日在实习僧投的简历 4月12号中午在面试中望软件回来的路上接到YY邀面电话 直接约下午5点45分线下面试 自己从新港东地铁站过去还是挺远的 大概5点钟就到了南村万博 下地铁之后走了一段路吧还算挺方便的 差不多到45分的时候面
  • ARP协议详解:了解数据包转发与映射机制背后的原理

    数据来源 一 广播与广播域概述 1 广播与广播域 广播 将广播地址做为目标地址的数据帧 广播域 网络中能接收到同一个广播所有节点的集合 广播域越小越好 收到的垃圾广播越少 这样通信效率更高 下图每个圈都是一个广播域 说明了交换机隔离不了广播
  • 区块链学习笔记(三)——从商鞅变法谈“共识机制”

    区块链学习笔记 三 从商鞅变法谈 共识机制 前言 一 商鞅变法的故事 总结一下 二 共识机制 1 什么是共识机制 2 要点 总结 前言 区块链健康运行的灵魂是 共识机制 那么什么是 共识机制 呢 一 商鞅变法的故事 相信大家都听过这么一个故
  • OpenStack的部署(八)------cinder组件

    目录 一 在CT控制节点配置Cinder 1 创建数据库实例和角色 2 创建用户 修改配置文件 3 开启Cinder服务 4 验证 二 在计算节点c2配置Cinder 存储节点 1 准备工作 2 配置cinder模块 3 开启cinder卷
  • 背景建模--Vibe 算法优缺点分析

    一 Vibe 算法的优点 Vibe背景建模为运动目标检测研究邻域开拓了新思路 是一种新颖 快速及有效的运动目标检测算法 其优点有以下两点 1 思想简单 易于实现 Vibe通常随机选取邻域20个样本为每个像素点建立一个基于样本的背景模型 具有
  • Python工具箱系列:使用Python实现简单的文本加密和解密

    Python工具箱系列 使用Python实现简单的文本加密和解密 在计算机科学中 数据加密是一项重要的技术 用于保护敏感数据的安全性 Python作为一种强大而受欢迎的编程语言 提供了丰富的库和工具 使得实现文本加密和解密变得相对容易 本文
  • 第40节 指北针实例

    目录 本节内容 本节代码 思路 以下为全部代码 本节内容 受网友提问 本节实现一个指北针 上面左下角的指北针由两部分组成 一部分是指针 一部分是底盘 底盘动 指针在动 默认朝向Z轴负方向是北 朝向X轴正方向是东 你可以感受一下 其它的方向就
  • termux下安装centos安装python

    安装termux 链接 f droid 下载安装 授存储权限 termux setup storage 提示输入y 换源 termux change repo 获权 termux chroot 先安装依赖 pkg install pytho
  • 冯乐乐之二 shader的数学

    冯乐乐目录 第2章渲染流水线介绍 第三章 Unity shader基础 基础shaderLab语言 shader结构 属性properties 主角SubShader 备胎Fallback shader三大类型 Unity宠儿表面着色器 聪