法线贴图
法线贴图:简单来说就是每一个片段都有他自己相应的法线的一个贴图 而不是一个平面统一使用同一个法线(这个贴图目前我知道的只能使用过ps制作出来 不会通过代码实现(很奇怪))
法线贴图的使用方法:
把纹理贴图使用ps得到法线贴图,将法线贴图存储在项目的纹理中,
通过采样器获取纹理相应的rgb值,这些rgb值就是贴图片段的法线xyz值
把每个片段法线应用在片段上就行
法线贴图在项目中实现的过程:
1.通过顶点数组获取到每个面所需的四个顶点
2.通过顶点和纹理坐标进行切线空间的计算(计算得出切线和副切线)
3.将切线和副切线传递给着色器 在着色器中计算出所需要的TBN矩阵
4.将需要计算的各项数据(比如物体顶点坐标,观察坐标,灯光坐标等)通过TBN矩阵转换进切线空间,再结合从法线贴图获取的法线就可以进行相应的光线计算了
计算出一种矩阵(这种矩阵叫做TBN矩阵(切线矩阵)这三个字母分别代表tangent、bitangent和normal向量),把法线从切线空间变换到一个不同的空间,这样它们就能和表面法线方向对齐了
切线空间的一大好处是我们可以为任何类型的表面计算出一个这样的矩阵
现在我们有了TBN矩阵,如果来使用它呢?通常来说有两种方式使用它,我们会把这两种方式都说明一下:
1.我们直接使用TBN矩阵,这个矩阵可以把切线坐标空间的向量转换到世界坐标空间。因此我们把它传给片段着色器中,把通过采样得到的法线坐标左乘上TBN矩阵,转换到世界坐标空间中,这样所有法线和其他光照变量就在同一个坐标系中了。
2.我们也可以使用TBN矩阵的逆矩阵,这个矩阵可以把世界坐标空间的向量转换到切线坐标空间。因此我们使用这个矩阵左乘其他光照变量,把他们转换到切线空间,这样法线和其他光照变量再一次在一个坐标系中了。
我们用方法2的好处是 可以把所有向量在顶点着色器中转换到切线空间中 因为lightPos和viewPos不是每个fragment运行都要改变
正交矩阵(每个轴既是单位向量同时相互垂直)的一大属性是一个正交矩阵的置换矩阵与它的逆矩阵相等
模型的法线贴图还没看 等会补上
这里回答几个问题:
1.什么是切线空间:切线空间就是法线贴图相应的坐标空间
2.为什么要使用切线空间:因为切线贴图显示的法线坐标是固定的(由颜色决定了法线的xyz坐标,并不会跟着贴图的旋转而改变)所以需要切线空间来实现法线贴图内部坐标和世界坐标的转换,使法线贴图的法线能和贴图平面法线方向大致一致
3.法线贴图的贴图怎么实现的:我目前还没理解
在最近的项目 家具项目中出现的问题:
1.我想实现对立方体的法线贴图,这时我就需要把六个面 十二个三角形的顶点变成像教程中的每个面四个顶点的模式 所以就要重新按规律的排布顶点数组,并且按照法线贴图教程里面的规则进行每个面的切线空间计算
关于为什么需要切线空间
切线空间到底是什么 就是每个三角形加上垂直于这个三角形平面组成的空间坐标系就是这个三角形的切线空间
TBN矩阵就是这个空间的基础坐标系i帽j帽k帽 我们乘上这个TBN矩阵就可以把切线空间中的物体移到世界坐标系去 如果乘TBN的逆矩阵就可以把世界坐标系的东西转入切线空间
我们获取的是法线贴图上的值 他是一张偏蓝的图 也就是(0,0,1)z轴上偏多的值 那也就意味着 如果我们将这张图正面朝向我们贴 就没什么问题 但是如果这张图贴在了一个发生了旋转的物体上 这个法线就不再正确 因为我们并没有对这个法线做任何计算 这样我们就每次都需要对要贴的面做一个判断 他是朝向哪一边的
从纹理中获取的法线就是一个自己空间的 他是相对于他这张纹理的z轴方向 所以我们要做的就是 要么把这个法线从这个空间里放到世界空间去 要么把在世界空间计算的光照放到这个空间来计算 这个相对于法线贴图纹理的这个空间就是切线空间
TBN矩阵
tangent、bitangent和normal
这个矩阵主要是将法线从他自己的切线空间可以转换到世界空间来 或者将其他的向量 例如光源向量 或者视向量转换到切线空间
这个就是矩阵变换中 需要一个变换把i帽j帽k帽变换为这个三角形空间来
计算TBN矩阵需要三角形的模型坐标 纹理坐标 然后这个TBN矩阵也要左乘整个模型的model矩阵 因为TBN肯定也会跟着变化
位移贴图
他是真的会通过获取的贴图对顶点进行变化
法线贴图在边缘还是圆的 阴影也会露馅
但是位移贴图他需要里面的三角形足够细 这样才方便移动
但是这样也可以通过曲面细分实现
法线贴图与切线空间详解
本文深入探讨了法线贴图的概念及其在3D渲染中的应用,解释了切线空间的重要性,以及如何使用TBN矩阵进行坐标转换,确保法线贴图的准确性。此外,还对比了法线贴图与位移贴图的区别。
1208

被折叠的 条评论
为什么被折叠?



