《Unity Shader入门精要》笔记:基础篇(2)

  • 本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载。
  • 本篇博客会补充一些扩展内容(例如其他博客链接)
  • 本篇博客还会提供一些边读边做的效果截图。文章内所有数学公式都由Latex在线编辑器生成。
  • 本篇博客主要提供一个“glance”,知识点的总结。如有需要请到书店购买正版。
  • 博客提及所有官方文档基于2022.2版本,博客会更新一些书中的旧的知识点到2022.2版本。
  • 个人博客网址:https://www.sugarcanesama.com/archives/1479,如文章转载中出现例如传送门失效等纰漏,建议直接访问原博客网址。

  • 如有不对之处欢迎指正。
  • 我创建了一个游戏制作交流群:637959304 进群密码:(CSGO的拆包密码)欢迎各位大佬一起学习交流,不限于任何平台(U3D、UE、COCO2dx、GamesMaker等),以及欢迎编程,美术,音乐等游戏相关的任何人员一起进群学习交流。


目录

Shader数学基础

坐标系

矢量

矩阵

矩阵变换

坐标空间


Shader数学基础

  • 矢量和矩阵的内容如果还没学到那么可以买本线性代数的小册子学一下。

坐标系

  • 笛卡尔坐标系,左手系,右手系:传送门,Unity使用的是左手坐标系(只有观察空间是右手坐标系)
  • Unity模型,世界,观察,裁剪空间坐标转换传送门
    模型空间(对象空间,每个模型自己的空间),世界空间(最大的宏观坐标系),观察空间(以摄像机为原点),裁剪空间(顶点传入的空间,进行裁剪等操作),投影空间(对应屏幕上的像素坐标)

矢量

  • :坐标中的一个位置
    矢量(vector,也被称作向量):n维空间中包含了模(magnitude)和方向(direction)的有向线段。矢量的模指适量的长度。方向描述了矢量在空间中的指向。
  • 矢量和标量的乘除法
    乘法:kv=vk

  • 除法:当k/v时没有意义

  • 矢量的加法和减法:矢量不可以和标量或不同维度的矢量加减

  • 矢量加法三角形定则(triangle rule):

  • 矢量的模:矢量的模是一个标量,即长度。

  • 单位矢量(unit vector):模为1的矢量。多用于计算光照模型中。矢量转换为单位矢量的过程成为归一化(normalization),零矢量不可以被归一化。

  • 矢量的乘法:点积(dot product),叉积(cross product)
    点积公式:点积满足交换律。点积的其中一个主要的几何意义为投影(projection)

  • 点积可结合标量乘法,加法减法同理

  • 矢量和自身点积就是矢量模的平方
  • 三角代数角度表示的矢量点积意义:两个矢量的点积可以表示为两个矢量的模相乘再乘以他们之间夹角的余弦值。

  • 矢量的叉积:结果为矢量,不满足交换律但满足反交换律(axb=-(bxa)),同时也不满足结合律。叉积的结果为垂直叉积的向量,但左右手系仅影响视觉观看效果(即方向相反),不影响性质和结果。

  • 叉积的模

矩阵

  • 矩阵的含义:传送门
  • 矩阵和标量的乘法:kM=Mk=把k乘入每个元素中。
  • 矩阵和矩阵的乘法:不满足交换律。满足结合律。

  • 特殊的矩阵:
    1、方块矩阵:行列数目相等
    2、对角矩阵:在方块矩阵的基础上,只有对角线上的元素有值
    3、单位矩阵:在对角矩阵的基础上,对角线上的元素值都为1。记一个矩阵M和一个单位矩阵I,IM=MI=M。
  • 转置矩阵:转置矩阵的转置等于原矩阵。矩阵串接的转置等于反向串接各个矩阵的转置。

  • 逆矩阵(inverse matrix):只有方阵才有可能有逆矩阵。方阵的行列式(determinant)不为0那么它就是可逆的。逆矩阵的逆矩阵是原矩阵本身。单位矩阵的逆矩阵也是他本身。转置矩阵的逆矩阵是逆矩阵的转置。矩阵串接相乘后的逆矩阵等于反向串接各个逆矩阵。

  • 正交矩阵(orthogonal matrix):一个方阵M和它的转置矩阵乘积为单位矩阵,那么这个矩阵就是正交的,反之也成立。正交矩阵的行列之间分别构成了一组标准正交基。

矩阵是正交的等价式

  • 正交基(orthogonal basis):一个坐标空间需要指定一组矢量基(即坐标轴),如果这些矢量基之间互相垂直,那么就把他们称为一组正交基。如果正交基中的向量长度都为1,那么它们就是一组标准正交基(orthonormal basis)。
  • 行列矩阵以及先后顺序对于矩阵乘法的结果有很大印象,Unity中常规做法是把矢量放在矩阵的右侧,即把矢量转换成矩阵来进行计算。例如:

矩阵变换

  • 变换(teansform):把一些数据,例如点、方向矢量、颜色等通过某种方式进行转换的过程。
  • 线性变换(linear transform):可以保留矢量加和乘的变换。缩放(scale)、旋转(rotation)、错切(shear)、镜像(mirroring/reflection)、正交投影(orthographic projection)等都属于线性变换。

  • 仿射变换(affine transform):合并线性变换和平移变换的变换,该变换可以使用一个4x4的矩阵来表示。

  • 齐次坐标空间(homogeneous space):传送门,即多一个维度来实现平移等操作的表示。如下图所示,M为原矩阵,t矩阵用于平移,0是零矩阵,1为普通标量。

  • 平移矩阵:可以使用矩阵乘法来表示对一个点进行平移变换。

  • 缩放矩阵:对一个模型沿空间x、y、z轴进行缩放。如果kx=ky=kz那么就称之为统一缩放(uniform scale),否则成为非统一缩放(nonuniform scale)

  • 旋转矩阵:绕x、y、z轴进行的旋转。

  • 复合变换:将上述变换进行组合。绝大多数情况下,我们约定变换的顺序是先缩放,再旋转,后平移。

坐标空间

  • 可以仔细阅读书中4.6.1-4.6.2的原理内容,这里不再作详细解释。因为你会发现,如果你不是编写底层数学工具的程序员,那么这些原理只需要知道例如为什么对于float4x4有些时候可以直接取float3x3计算即可。在具体实践中往往有相关的转换函数来直接完成操作。
  • 顶点的坐标空间变换过程:一个顶点最开始在模型空间中定义,最后他将会变换到屏幕空间中,得到真正的像素坐标奥。
  • 模型空间(model space):有时被称为对象空间(object space)或局部空间(local space)。每个模型都有自己独立的坐标空间,当它被移动或旋转的时候,模型空间也会跟着移动和旋转。
  • 世界空间(world space):最宏观的空间。顶点变换的第一步,就是将顶点坐标从模型空间变换到世界空间中。这个变换通常叫做模型变换(model transform)。
  • 观察空间(view space):也被称为摄像机空间(camera space)。观察空间是一个三维空间,而屏幕空间是一个二维空间。从观察空间到屏幕空间的转换需要经过投影(projection)的操作。顶点变换的第二步,就是将顶点坐标从世界空间变换到观察空间中。这个变换通常叫做观察变换。
  • 裁剪空间(clip space):顶点从观察空间转换到裁剪空间,其中用于变换的矩阵叫做裁剪矩阵(clip matrix),也被称为投影矩阵(projection matrix)。裁剪空间的目标是能够方便地对渲染图元进行裁剪,由视锥体(view frustum)决定裁剪范围。
    视锥体由六个平面包围而成,这些平面被称为裁剪平面(clip planes)。视锥体有两种类型,一种是正交投影(orthographic projection),一种是(perspective projection)。透视投影钟,渲染地图上的平行线不会保持摄像机所见的平行,离摄像机越近网格越大,反之越小。正交投影中所有网格大小一致,且平行线会一直保持平行。视锥体有两个平面,近剪裁平面和远剪裁平面,决定了摄像机可以看到的深度范围。
  • 投影矩阵为投影做准备,但没有进行真正的投影工作。投影矩阵对x、y、z分量进行缩放,方便判断顶点是否位于裁剪空间内。

视锥体的六个面

  • 屏幕空间(screem space):经过裁剪操作后,进行真正的投影工作,把视锥体投影到屏幕空间。屏幕空间是二维空间,因此要把顶点从裁剪空间投影到屏幕空间中。
    步骤:1、进行标准齐次除法(homogeneous division),也被称为透视除法。
    2、根据变换后的x、y坐标来映射输出窗口的对应像素坐标。用齐次坐标的w分量除以x、y、z分量。屏幕映射只会把x、y分量进行处理,z分量会被用于深度缓冲中。

经过齐次除法,裁剪空间会变换成一个立方体

  • 法线变换:传送门,了解法线(normal),切线(ta

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值