Graphics 法线和切线到达像素/片段着色器时如何仍然正交?

Graphics 法线和切线到达像素/片段着色器时如何仍然正交?,graphics,fragment-shader,vertex-shader,Graphics,Fragment Shader,Vertex Shader,我直觉地认为,如果你从两个正交向量线性插值到另两个正交向量,那么得到的两个向量也会相互正交。我假设如果你有基轴X,Y,Z,它们是相互正交的单位向量,你可以通过旋转进行插值,结果仍然是三个正交向量。显然 所以我的计划是平均切线和法线以创建平滑外观是不可能的。然而我只是想,当顶点着色器向片段/像素着色器发送值时,它们会被赋予“线性插值”值,对吗?这意味着如果我有正交的法线和切线向量,当它们到达片段/像素着色器时,它们不再相互正交,对吗?这不是个问题吗 插值后法线和切线可能不正交 这是因为插值是插值位

我直觉地认为,如果你从两个正交向量线性插值到另两个正交向量,那么得到的两个向量也会相互正交。我假设如果你有基轴X,Y,Z,它们是相互正交的单位向量,你可以通过旋转进行插值,结果仍然是三个正交向量。显然

所以我的计划是平均切线和法线以创建平滑外观是不可能的。然而我只是想,当顶点着色器向片段/像素着色器发送值时,它们会被赋予“线性插值”值,对吗?这意味着如果我有正交的法线和切线向量,当它们到达片段/像素着色器时,它们不再相互正交,对吗?这不是个问题吗

  • 插值后法线和切线可能不正交

    这是因为插值是插值位置而不是角度。这意味着,如果对位置进行线性插值,角度通常会发生非线性变化。所以在大多数情况下,插值向量不再相互对应(除了起始值和结束值)

  • 平滑TBN

    这是可能的,但您需要再次对向量进行OR语法化,如下所示:

    t = cross(b,n)
    b = cross(n,t)
    t=normalize(t);
    b=normalize(b);
    n=normalize(n);
    
    然而,在大多数情况下,非正交性并不是那么糟糕,而且这些东西都能工作 也没有这个步骤