Opengl 不使用切线/双切线向量的法线映射

Opengl 不使用切线/双切线向量的法线映射,opengl,3d,webgl,Opengl,3d,Webgl,不幸的是,许多教程将TBN矩阵描述为任何类型法线映射的事实上必须的,而没有详细说明为什么会出现这种情况,这让我对一个特定场景感到困惑 让我们假设我需要在屏幕上的一个简单的四边形上应用凹凸/法线贴图,稍后可以通过它的法线矩阵进行变换 如果在任何变换之前处于“静止位置”的四边形曲面法线正好指向正z方向(opengl),仅使用模型矩阵变换从法线纹理贴图读取的向量是否足够 vec3 bumpnormal = texture2D(texture, Coord.xy); bumpnormal = mat3(

不幸的是,许多教程将TBN矩阵描述为任何类型法线映射的事实上必须的,而没有详细说明为什么会出现这种情况,这让我对一个特定场景感到困惑

让我们假设我需要在屏幕上的一个简单的四边形上应用凹凸/法线贴图,稍后可以通过它的法线矩阵进行变换

如果在任何变换之前处于“静止位置”的四边形曲面法线正好指向正z方向(opengl),仅使用模型矩阵变换从法线纹理贴图读取的向量是否足够

vec3 bumpnormal = texture2D(texture, Coord.xy);
bumpnormal = mat3(model) * bumpnormal;  //assuming no scaling occured
如果我们计算立方体上的凹凸法线,而不考虑具有相同纹理坐标的不同面实际上有不同的方向,我确实理解事情会发生什么变化,这就引出了下一个问题

假设整个模型仅使用单个法线贴图纹理,而不在模型的不同部分重复所述纹理坐标,是否可以保存为每个顶点存储的切线/双切线向量的6个浮点值,以及TBN矩阵altogheter的计算,同时通过简单地将凹凸法线与模型的矩阵进行变换来获得相同的结果? 如果是这样,为什么它不是首选解决方案?

基本上我认为你描述的是这种方法。我同意这在很多方面都是优越的。它使以后的计算更加清晰,而不是陷入混乱的空间变换

不要把所有的东西都计算到切线空间中,你只需要找到正确的世界空间法线。这就是我在项目中使用的方法,我很高兴找到了这种方法。

基本上我认为你描述的是这种方法。我同意这在很多方面都是优越的。它使以后的计算更加清晰,而不是陷入混乱的空间变换

不要把所有的东西都计算到切线空间中,你只需要找到正确的世界空间法线。这就是我在项目中使用的方法,我很高兴我找到了这种方法

如果在任何变换之前处于“静止位置”的四边形曲面法线正好指向正z方向(opengl),仅使用模型矩阵变换从法线纹理贴图读取的向量是否足够

vec3 bumpnormal = texture2D(texture, Coord.xy);
bumpnormal = mat3(model) * bumpnormal;  //assuming no scaling occured
没有

假设从法线贴图得到的值是(1,0,0)。这意味着地图上的法线指向右边

所以。。。那到底在哪里?或者更重要的是,当我们说“对”时,我们处于什么样的空间

现在,你们可能会马上认为右边就是模型空间中的+X。但问题是,事实并非如此。为什么?

因为你的纹理坐标

如果模型空间矩阵围绕模型空间Z轴顺时针旋转90度,并通过该矩阵变换法线,则得到的法线应从(1,0,0)变为(0,-1,0)。这是人们所期望的

但是,如果你有一个面向+Z的正方形,并且你围绕Z轴旋转它90度,这不应该产生与旋转纹理坐标相同的结果吗?毕竟,是纹理坐标定义了U和V相对于模型空间的含义

如果正方形的右上角纹理坐标为(1,1),左下角为(0,0),则纹理空间中的“右”表示模型空间中的“右”。但如果更改贴图,使(1,1)位于右下角,(0,0)位于左上角,则纹理空间中的“右”在模型空间中已变为“下”(-Y)

如果忽略纹理坐标,即从模型空间位置到纹理上位置的映射,则(1,0,0)法线仍将指向模型空间中的“右”。但是纹理贴图说它应该在模型空间中指向下(0,-1,0)。就像旋转模型空间本身一样

使用切线空间法线贴图时,存储在纹理中的法线与纹理映射到曲面的方式有关。定义从模型空间到切线空间(纹理映射的空间)的映射是TBN矩阵的用途

随着对象和法线之间的映射变得更加复杂,这一点变得更加复杂。你可以在四边形的情况下伪造它,但对于一般图形,它需要算法。毕竟,映射不是恒定的。它涉及拉伸和倾斜,因为不同的三角形使用不同的纹理坐标

现在,有了对象空间法线贴图,可以生成模型空间中显式显示的法线。这些避免了切线空间基矩阵的需要。但它将法线贴图与使用它的对象紧密关联。您甚至不能进行基本的纹理坐标动画,更不用说允许法线贴图与两个单独的对象一起使用了。如果你在做骨量蒙皮,它们几乎不可行,因为三角形经常改变大小

如果在任何变换之前处于“静止位置”的四边形曲面法线正好指向正z方向(opengl),仅使用模型矩阵变换从法线纹理贴图读取的向量是否足够

vec3 bumpnormal = texture2D(texture, Coord.xy);
bumpnormal = mat3(model) * bumpnormal;  //assuming no scaling occured
没有

假设从法线贴图得到的值是(1,0,0)。这意味着地图上的法线指向右边

所以。。。那到底在哪里?或者更重要的是,当我们说“对”时,我们处于什么样的空间

现在,你们可能会马上认为右边就是模型空间中的+X。但问题是,事实并非如此。为什么?

因为你的纹理坐标

如果模型空间矩阵围绕模型空间Z轴顺时针旋转90度,并通过该矩阵变换法线,则得到的法线应从(1,0,0)变为(0,-1,0)。这是人们所期望的

但是如果你有一个正对+Z的正方形,你把它绕Z轴旋转90度,sh