2021-05-16

今天学习了《UnityShader入门精要》的第七章基础纹理 第二节:凹凸映射 -> 在世界坐标系下

在顶点着色器上用到了以下的写法:

看到 Ttow2  就懵了, 这是个什么矩阵?干啥用的?就继续往下看片元着色器:

哦,我悟了,接下来是不是应该是把我们存进去的值再取出来了:

写完看看书,“*********”, 全错了。

书上是这么解释的:

我们计算了世界空间下的顶点切线、副切线和法线矢量表示,并把他们按列摆放得到从切线空间到世界空间的变换矩阵。我们把该矩阵的每一行分别存储在Ttow0、Ttow1和Ttow2中,并把世界空间下的顶点位置的xyz分量分别存储在了这些变量的w中

.......(此处省略若干字)。最后,我们使用Ttow0、Ttow1、和Ttow2存储的变换矩阵把法线变换到世界空间下。

这是怎么变的?我百度了一下,发现一本书的  18.3 纹理/正切空间https://www.doc88.com/p-2911793166791.html?r=1  ) 解释了这个问题 

我来说下我的理解:

我们在片元着色器中取出法线贴图的向量bump是基于纹理坐标系的,在片元着色器我们需要通过法线、光照方向、视角方向 来计算出片元着色器需要的高光、漫反射。只有这些值在同一个坐标系中我们才能得到正确的结果

但是:

我们从法线贴图中得到的法线是纹理坐标系(TBN)下, 光线、视角方向 却是基于世界坐标系或者物体坐标系的。

"凹凸映射 -> 在世界坐标系下" 中统一用的是世界坐标系

Ttow0、Ttow1、和Ttow2 就是用来把纹理坐标系坐标转换成世界坐标坐标的矩阵

为什么他们能转换?

我把 18.3 纹理/正切空间 讲述的TBN坐标系图中我们可以得到 在世界空间下:

e0向量(世界坐标系)  = T轴的单位向量T(表示t轴在世界坐标系下的坐标) *  T轴上的差值u0(纹理坐标系上的差值)  + B轴上的单位向量B(表示B轴在世界坐标系下的坐标) * B轴上的差值(b轴在纹理坐标系下的差值)

e1向量用的也是同样的方法

向量从纹理坐标转换为世界坐标的公式我们有了:

接下来我们要把它变换成矩阵

e0 = u0 * T + v0 * B

我们可以写作(因为u0方向和 T方向一致,转换公式中省略了cos):

(e0x, e0y, e0z) = u0 * (Tx, Ty, Tz) + v0* (Bx, By, Bz);

(e0x, e0y, e0z) = u0 * Tx + u0 * Ty + u0 * Tz + v0 * Bx + v0 * By + v0 * Bz 

(e0x, e0y, e0z) = (Tx + Ty + Tz) * u0 + (Bx + By + Bz) v0

这时我们再看下下面的矩阵:

如果我们把e1去掉 就变成了

展开之后就和我们上面的展开式一摸一样

由此我们知道: 我们通过纹理坐标系上T轴的单位向量和B轴的单位向量 在 世界坐标系中的坐标组成的矩阵就可以把纹理坐标转换为世界坐标

那么T轴和B轴在shader中表示的是什么呢?这就是我们的worldTangent(切线)、worldBinormal(副切线)这就是我们Ttow0和Ttow1和Ttow2值的来源.

不过还有个疑问,这里的worldNormal 和 bump.z的点乘又是做什么的?

这里我也有个大胆的想法:

我们这里计算的在平面上的坐标,但是我们通过UnpackNormal()取出来的是个三维的坐标。worldNormal就是用来转换三维坐标z值的。具体如何转换可以参考下:

我们通过向量a * 单位向量x * 单位向量x = 向量a在x轴上的分向量。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值