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的点乘又是做什么的?
标签:05,16,矩阵,u0,纹理,v0,2021,我们,坐标系 来源: https://blog.csdn.net/qq_24448219/article/details/116886632