OpenGL3.3法线贴图

法线贴图
法线贴图:简单来说就是每一个片段都有他自己相应的法线的一个贴图 而不是一个平面统一使用同一个法线(这个贴图目前我知道的只能使用过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.我想实现对立方体的法线贴图,这时我就需要把六个面 十二个三角形的顶点变成像教程中的每个面四个顶点的模式 所以就要重新按规律的排布顶点数组,并且按照法线贴图教程里面的规则进行每个面的切线空间计算

你可能感兴趣的:(opengl)