2017-09-15 55 views
1

我目前正試圖在我的Vulkan渲染器中實現正常映射。 但是,由於某些原因,我的TBN矩陣不正確地轉換法線貼圖。 我正在關注用於實現法線貼圖的learnopengl [dot] com教程。 在OpenGL(我之前使用過)中,我沒有遇到正常映射的問題。 然而,在這裏你可以看到問題的兩個視頻:Vulkan正常映射方向問題

1:https://www.youtube.com/watch?v=RWLkka939w0&feature=youtu.be

2:https://www.youtube.com/watch?v=fkPp7wYwNGI&feature=youtu.be

渲染我的漫反射顏色(目前它正向渲染時,第一個顯示的效果有一個方向燈)第二個顯示渲染器的正常輸出。 白球和圓環正在使用頂點法線。正如你所看到的使用頂點法線一樣,光線是正確的(我也用紋理球和塊測試了它)。 將TBN矩陣應用於法線貼圖時,旋轉立方體時,光線熄滅並且接縫改變方向。 這裏是GLSL代碼來計算TBN矩陣:

頂點着色器:

void main() { 

    vec4 pos = u_main.model * vec4(position, 1.0); 

    mat3 normal_matrix = transpose(inverse(mat3(u_main.model))); 

    vec3 T = normalize(normal_matrix * tangent.xyz); 
    vec3 N = normalize(normal_matrix * normal); 

    vec3 B = normalize(cross(N, T) * tangent.w); 

    v_TBN = mat3(T, B, N); 

    FragmentPosition = vec3(pos); 
    v_position = pos.xyz/pos.w; 
    v_TexCoord = tex_coord; 
    v_normal = normalize(normal_matrix * normal); 

    //The proj has been manipulated like here: https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/ 
    gl_Position = u_main.proj * u_main.view * u_main.model * vec4(position, 1.0); 
} 

片段着色器:

vec3 N = texture(t_Normal, v_TexCoord).rgb; 

N = v_TBN * (N * 2 - 1); 

事情我已經嘗試過:

  • 我用Gltf加載使用+ y的模型,所以我將所有的y座標乘以-1。
  • 我嘗試了一些公式來計算着色器中的TBN矩陣。但我沒有正確理解它,並且正常的工作不正常,所以我放棄了它。
  • 通過GLSL功能轉換我的法線貼圖從sRGB進行線性顏色:

vec3 srgb_to_linear(vec3 c) { 
    return mix(c/12.92, pow((c + 0.055)/1.055, vec3(2.4)), step(0.04045, c)); 
} 

我希望有人有一個想法,這可能是什麼。我現在正在掙扎2周左右^^。 如果您需要更多信息,請告訴我。 在此先感謝!

-siebencorgie

+1

gltf規範通過將tangent.w轉換爲1或-1來指示頂點的旋向性。我看到有人像這樣實施它。 – Siebencorgie

+2

youtube鏈接不適用於我(「此視頻不可用」) – Columbo

+0

另一個很好的例子說明爲什麼所有相​​關內容都應該包含在問題本身*中。還有誰在sRGB中創作法線貼圖? –

回答

1

嗯,我發現了。

這確實是一個錯誤的解釋圖像。我爲法線貼圖加載的圖像在Vulkan中定義爲Srgb(出於某種原因)。這導致了錯誤。 我想我沒有因爲太久的夜晚發現錯誤。

感謝任何事情!