Opengl 从高度图计算的法向量位于哪个坐标系?

Opengl 从高度图计算的法向量位于哪个坐标系?,opengl,textures,shader,heightmap,Opengl,Textures,Shader,Heightmap,我读了很多关于高度图和法线图的资料,有很多问题: 我们可以从heightmap生成法线贴图: 如果我们在S和T方向有: S(i,j)= <1,0,aH(i+1,j)−aH(i−1,j)> T(i,j)= <0,1,aH(i,j+1)−aH(i,j−1)> 然后我们将(Nx,Ny,Nz)映射到(r,g,b),这是我们从高度映射生成法线映射的方法 我尝试了几种高度贴图和漫反射贴图(将漫反射转换为灰度作为高度贴图)。简单的可以提供相对较好的法线贴图。一旦图像变得更复杂,结果就

我读了很多关于高度图和法线图的资料,有很多问题:

我们可以从heightmap生成法线贴图: 如果我们在S和T方向有:

S(i,j)= <1,0,aH(i+1,j)−aH(i−1,j)>
T(i,j)= <0,1,aH(i,j+1)−aH(i,j−1)>
然后我们将(Nx,Ny,Nz)映射到(r,g,b),这是我们从高度映射生成法线映射的方法

我尝试了几种高度贴图和漫反射贴图(将漫反射转换为灰度作为高度贴图)。简单的可以提供相对较好的法线贴图。一旦图像变得更复杂,结果就会非常糟糕

我的问题是:

  • 这个法向量在哪个坐标系

    我感觉它就在物体的表面,指向法线。这就是所谓的“TBN”空间吗

    但这里没有T和B的信息

  • 如果t是切线空间,那么对于不同的三角形,我们会有不同的t,那么不同的三角形会有不同的t/B/N向量

  • 如何从法线贴图计算TBN?我读这本书时有点困惑,看看这个矩阵:

    s1,t1 = < s1 − s0,t1 − t0 >
    s2,t2 = < s2 − s0,t2 − t0 >
    
       | Tx Ty Tz |              | s1 t1 | | Q1x Q1y Q1z |
       | Bx By Bz | = inverse of | s2 t2 | | Q2x Q2y Q2z |
    
    s1,t1=
    s2,t2=
    |Tx Ty Tz | | s1 t1 | | Q1x Q1y Q1z|
    |Bx乘以Bz |=| s2 t2 | Q2x Q2y Q2z的逆|
    
    s2和s1代表什么,我知道(Q1x Q1y Q1z),它们是法线贴图中的(x,y,z)值还是(r,g,b)值,s2和s1代表(x,y)位置,法线贴图上的像素位置吗


我想有一些主要的误解:TBN不是从法线贴图计算出来的。切线空间仅取决于几何体(使用纹理坐标(s,t))。我不确定我能用这么长的篇幅来解释整个问题。你可能想看看这里的解释:谢谢,好文章。我解释了一些概念:每个三角形都有自己的TBN坐标系。更好地理解矩阵计算过程。虽然仍然在想如何创建法线贴图,但你描述计算的方式对我来说很好。如果它不起作用,我建议你问一个新问题,准确描述你在做什么(包括代码),并在结果不好的地方显示输入+输出图像,我觉得从heightmap生成的法线贴图与模型附带的法线贴图相比,丢失了一些小细节,甚至使用了一些过滤器来增强计算。第二,我认为只有一个切线方向,最快的增加或减少方向,但事实证明这是梯度,而不是切线向量,所以我们可以随机选择TB,比如在计算中它与uv对齐。我说得对吗?再次感谢。我想有一些主要的误解:TBN不是从法线贴图计算出来的。切线空间仅取决于几何体(使用纹理坐标(s,t))。我不确定我能用这么长的篇幅来解释整个问题。你可能想看看这里的解释:谢谢,好文章。我解释了一些概念:每个三角形都有自己的TBN坐标系。更好地理解矩阵计算过程。虽然仍然在想如何创建法线贴图,但你描述计算的方式对我来说很好。如果它不起作用,我建议你问一个新问题,准确描述你在做什么(包括代码),并在结果不好的地方显示输入+输出图像,我觉得从heightmap生成的法线贴图与模型附带的法线贴图相比,丢失了一些小细节,甚至使用了一些过滤器来增强计算。第二,我认为只有一个切线方向,最快的增加或减少方向,但事实证明这是梯度,而不是切线向量,所以我们可以随机选择TB,比如在计算中它与uv对齐。我说得对吗?再次感谢。
s1,t1 = < s1 − s0,t1 − t0 >
s2,t2 = < s2 − s0,t2 − t0 >

   | Tx Ty Tz |              | s1 t1 | | Q1x Q1y Q1z |
   | Bx By Bz | = inverse of | s2 t2 | | Q2x Q2y Q2z |