【Unity Shader】基础知识(数学)

您所在的位置:网站首页 unity光照贴图创建 【Unity Shader】基础知识(数学)

【Unity Shader】基础知识(数学)

#【Unity Shader】基础知识(数学)| 来源: 网络整理| 查看: 265

掌握内容:【线性代数】

一、 向量向量:有大小和方向的有向线段;标量:只有大小,没有方向的量;

点乘:也称内积,点乘的结果是一个标量。对于向量a和向量b:

a和b的点积公式为:

要求一维向量a和向量b的行列数相同。点乘的几何意义是可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影。

叉乘:又叫外积,叉乘的结果是一个向量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。对于向量a和向量b:

在三维几何中,向量a和向量b的叉乘结果被称为法向

,该向量垂直于a和b向量构成的平面。

二、 矩阵 矩阵×矩阵=矩阵(所有的复合操作可以总结为一个总得矩阵) 矩阵×向量=向量(一个变换矩阵对向量进行Transform)

矩阵相乘顺序从右往左。坐标变换顺序: 缩放->旋转->平移,即[平移][旋转][缩放][向量]

常见矩

阵:

矩阵变换:模型空间-世界空间-观察空间-裁剪空间-屏幕空间

MVP矩阵MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。顶点坐标起始于局部坐标(Local Coordinate),之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。

1. 模型空间:局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标。 2. 世界空间:指顶点相对于(游戏)世界的坐标。 3. 观察空间:从摄像机的视角所观察到的空间 4. 裁剪空间:在一个顶点着色器运行的最后,OpenGL期望所有的坐标都能落在一个特定的范围内,且任何在这个范围之外的点都应该被裁剪掉(Clipped)。被裁剪掉的坐标就会被忽略,所以剩下的坐标就将变为屏幕上可见的片段。

观察矩阵(View Matrix):让观察空间的坐标系移到世界空间的坐标系投影矩阵(Projection Matrix):判断顶点是否在可见范围内。

常用矩阵:UNITY_MATRIX_MVP: 投影矩阵,用于将顶点/方向从模型空间变换到裁剪空间-UNITY_MATRIX_V[2].xyz:表示相机的朝向,即C #代码里的transform.forward UNITY_MATRIX_T_MV: 转置矩阵UNITY_MATRIX_IT_MV: 逆转置矩阵

三、 空间

齐次裁剪空间:从观察空间到裁剪空间,用于变换的矩阵叫做裁剪矩阵。裁剪空间的目标是能够方便地对渲染图源进行裁剪:完全位于这块空间内部的图元将会被保留,完全位于这块空间外部的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。

切线空间(TBN)

为什么要有切线空间?

实际上,法线本身存储在哪个坐标系中都是可以的,例如存储在World Space、或者Object Space、或者Tangent Space中。但问题是,我们并不是单纯的想要得到法线,后续的光照计算才是我们的目的。不管使用哪个坐标系,都面临着一个选择,就是最后光照计算使用的坐标系究竟是哪个。对于Tangent-Space Normal Map,我们一般就是在Tangent Space里计算的,也就是说,我们需要把viewDir、lightDir在Vertex Shader中转换到Tangent Space中,然后在Fragment Shader对法线纹理采样后,直接进行光照计算。

为什么切线空间的法线贴图整体偏蓝?

归一化之后,法线每个点的取值范围应该都在[-1, 1]之间,但是由于切线空间中任意一点的法线与N坐标轴的夹角都小于90度,也就是说法线的z值会大于零,所以取值范围为[0, 1]。 通常情况下,法线坐标的存储范围在[0, 1]之间,所以要进行映射,映射之后z值的范围就变成了[0.5, 1],而z值对应的就是RGB通道中的B通道,所以导致法线贴图的颜色整体偏蓝。模型空间的法线纹理,所有法线的坐标都是在模型空间,每个点存储的法线方向都是各异的,经过映射之后就变成了RGB(x,y,z) ,而x,y,z并不一致,所以对应着不同的颜色。所以模型空间的法线纹理看起来是五颜六色的。切线空间的法线纹理,所有法线的坐标都是在各自的切线空间,新的法线方向就是 Z 轴,即(0,0,1),经过映射就是(0.5,0.5,1)浅蓝色。所以切线空间的法线纹理看上去大部分都是蓝色的,这也说明了顶点的大部分法线是和模型本身法线一样的。

切线空间的法线纹理还有如下一些优点 :① 自由度高。记录的是相对法线信息,这意味着,即便把该纹理应用到一个完全不同的网格上,也可以得到一个合理的结果。② 可以制作UV动画。我们可以移动一个纹理的UV坐标来实现一个凹凸移动的效果。③ 可以压缩。由于切线空间的法线的Z方向总是正方向的,因此我们可以仅存储XY方向,而推导得到Z方向。④ 可以重复利用。比我们可以仅使用一张Normal Map就可以用到正方体所有的六个面上。

快速判断OpenGL和DirectX法线的技巧:

四、 函数

abs(a):返回a的绝对值round(x):返回与x最近的整数sqrt(x):返回x的平方根pow(x,y):x的y次幂exp(x):返回e为底的指数函数log(x):返回e为底的对数函数ceil(x):返回>=x的最小整数floor(x):返回



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3