冯乐乐之二 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的数学 的相关文章

  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 为 webgl 中的每个对象使用不同的顶点和片段着色器

    我在 webgl 中有一个包含多个对象的场景 对于每个对象 我想使用不同的顶点和片段着色器 我的第一个问题是 是否可以为每个对象都有一个着色器 我知道在 opengl 中这是可能的 这是与我的想法类似的伪代码 任何例子将不胜感激 glena
  • 用于几何入口点的 SceneKit 着色器修改器适用于 iOS,但不适用于 OS X

    我正处于制作 SceneKit 着色器修改器 用于几何入口点 的早期阶段 该修改器根据高度图纹理置换平面的几何形状 计划是用它来创建地形 在 iOS 编辑 iOS 模拟器 中 着色器按其应有的方式工作 但会将此警告打印到控制台 SceneK
  • 5_机械臂运动学基础_矩阵

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

    我正在尝试在 C 中使用像 glShaderSource 这样的东西 Visual Studio 表示像 glCompileShader 或 glCreateProgram 这样的函数不存在 我使用 FreeGLUT 来包含 OpenGL
  • OpenGL Phong 光照:镜面高光错误

    我的 OpenGL 中的 Phong 光照着色器似乎有一个奇怪的问题 镜面高光出现在对象的错误一侧 手头的问题 正如您所看到的 镜面高光出现在立方体的另一侧 从灯光的角度来看 也出现在立方体垂直边缘的角上 它应该只出现在最靠近灯光的一侧 立
  • 用于在基于着色器的游戏中进行渲染的 OO 架构

    在构建游戏引擎时 我一直遇到这个问题 我的类希望看起来像这样 interface Entity draw class World draw for e in entities e draw 这只是伪代码 大致展示了绘图是如何发生的 每个实体
  • 线性光模式的 Alpha 混合层

    我正在重新创建一些 Photoshop 混合 并尝试使用线性光模式 在 Photoshop 中 您将有一个不透明度为 100 的背景图层 然后是一个不透明度为 50 的顶层 其混合模式设置为 线性光 我确实找到了有关如何进行线性光混合的信息
  • 着色器:如何在不生成几何体的情况下绘制 3D 点顶点?

    我有一个 3D Webgl 场景 我正在使用Reglhttp regl party http regl party 这就是WebGL 所以我本质上是直接写 GLSL 这是一个游戏项目 我有一个 3D 位置数组 x y z 它们是子弹或射弹
  • OpenGL 定向光着色器

    我想使用 OpenGL 和 GLSL 将定向光添加到我的场景中 问题在于 理论上正确的方法会产生错误的结果 在顶点着色器中我执行以下操作 光线的方向以世界坐标给出 并使用 viewMatrix 转换为相机坐标 使用法线矩阵将顶点的法线转换为
  • GLSL 纹理立方体和纹理2D 在同一着色器中

    我似乎无法两者兼得texture2D and textureCube 在一个着色器中 当我这样做时 什么也没有显示 也没有错误 我用我自己的着色器加载器和 Apple GLSL 着色器生成器尝试了这一点 并且发生了同样的事情 即使我有也会发
  • OpenGL ES 2.0 多个程序或多着色器还是什么?它是如何工作的?

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

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 根据 GLSL 中向量的特定分量执行最小-最大的最快方法?

    我需要在我的 GLSL 代码中多次调用这种函数 vec2 minx vec2 a vec2 b if a x lt b x return a else return b 我担心过度分支 有没有办法避免 if else 结构 我建议使用 GL
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • Three.js、自定义着色器和具有透明度的 png 纹理

    我有一个非常简单的 PNG 纹理 一个带有透明背景的灰色圆圈 我用它作为制服map for a THREE ShaderMaterial var uniforms THREE UniformsUtils merge basicShader

随机推荐

  • 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宠儿表面着色器 聪