如何混合世界空間法線


3

我正在嘗試在著色器中混合兩個世界空間法線。一個來自使用經典TBN矩陣的切線空間法線貼圖轉換為世界空間,另一個是世界空間中的網格法線貼圖。

我在這裡找到了一些有趣的資源:

但是這些混合技術似乎僅適用於切線空間法線,尤其是重定向法線貼圖(RNM)。我嘗試將RNM技術應用到已經完成的拆包中。

n1 += vec3(0, 0, 1);
n2 *= vec3(-1, -1, 1);

return n1 * dot(n1, n2) / n1.z - n2;

但是,這並沒有給出預期的結果,我也不知道為什麼。有沒有辦法將RNM混合應用於世界空間法線?

非常感謝。

編輯:以下是一些輸出以及我在RNM上獲得的結果。A法線不受B法線的干擾,它給出了一些奇怪的大規模重定向結果。

float3 nv = dot(normal, viewDir);
color.rgb = nv;

2

Huge thanks to @MJP who answered this.
The aim is to avoid the simplification made when using tangent space normals. Here is the paper : Blending in detail

But only implement equation (4) which gives you this.

float3 ReorientNormal(in float3 u, in float3 t, in float3 s)
{
    // Build the shortest-arc quaternion
    float4 q = float4(cross(s, t), dot(s, t) + 1) / sqrt(2 * (dot(s, t) + 1));
    // Rotate the normal
    return u * (q.w * q.w - dot(q.xyz, q.xyz)) + 2 * q.xyz * dot(q.xyz, u) + 2 * q.w * cross(q.xyz, u);
}

Original answer is here.