2017-01-02 45 views
3

我目前正在研究我的第一個基於OpenGL的遊戲引擎。我需要法線貼圖作爲功能,但它不能正常工作。OpenGL法線貼圖問題 - 法線可能面對錯誤的方向?

Here is an animation of what is Happening

的工件被光並在表面上的法線之間的角度的影響。相機移動不會以任何方式影響它。我也是(現在至少在現在)採用效率較低的方法,將從法線貼圖提取的法線轉換爲視圖空間,而不是將所有東西都轉換爲切線空間。

這裏是我的代碼的相關部分:

生成切線和Bitangents

 for(int k=0;k<(int)mb->getIndexCount();k+=3) 
     { 
      unsigned int i1 = mb->getIndex(k); 
      unsigned int i2 = mb->getIndex(k+1); 
      unsigned int i3 = mb->getIndex(k+2); 

      JGE_v3f v0 = mb->getVertexPosition(i1); 
      JGE_v3f v1 = mb->getVertexPosition(i2); 
      JGE_v3f v2 = mb->getVertexPosition(i3); 

      JGE_v2f uv0 = mb->getVertexUV(i1); 
      JGE_v2f uv1 = mb->getVertexUV(i2); 
      JGE_v2f uv2 = mb->getVertexUV(i3); 

      JGE_v3f deltaPos1 = v1-v0; 
      JGE_v3f deltaPos2 = v2-v0; 
      JGE_v2f deltaUV1 = uv1-uv0; 
      JGE_v2f deltaUV2 = uv2-uv0; 

      float ur = deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x; 

      if(ur != 0) 
      { 
       float r = 1.0/ur; 

       JGE_v3f tangent; 
       JGE_v3f bitangent; 

       tangent = ((deltaPos1 * deltaUV2.y) - (deltaPos2 * deltaUV1.y)) * r; 
       tangent.normalize(); 

       bitangent = ((deltaPos1 * -deltaUV2.x) + (deltaPos2 * deltaUV1.x)) * r; 
       bitangent.normalize(); 

       tans[i1] += tangent; 
       tans[i2] += tangent; 
       tans[i3] += tangent; 
       btans[i1] += bitangent; 
       btans[i2] += bitangent; 
       btans[i3] += bitangent; 
      } 
     } 

Here's a picture of the Tangents

計算在頂點着色器 的TBN矩陣(mNormal校正爲正常的非統一標尺)

vec3 T = normalize((mVW * vec4(tangent, 0.0)).xyz); 
tnormal = normalize((mNormal * n).xyz); 
vec3 B = normalize((mVW * vec4(bitangent, 0.0)).xyz); 

tmTBN = transpose(mat3(
T.x, B.x, tnormal.x, 
T.y, B.y, tnormal.y, 
T.z, B.z, tnormal.z)); 

最後這裏是我用的採樣從一般的法線貼圖,並試圖將其轉換成片段着色器來查看空間

fnormal = normalize(nmapcolor.xyz * 2.0 - 1.0); 
fnormal = normalize(tmTBN * fnormal); 

「nmapcolor」是從正常的地圖樣本顏色。 然後在照明計算中使用「正常」。

我一直在試圖解決這個問題這麼久,絕對不知道如何讓這個工作。任何幫助將不勝感激。

編輯 - 我稍微修改了代碼以在世界空間中工作並輸出結果。大平臺沒有正常的映射(並且它工作正常),而較小的平臺卻沒有。 World Space Normals

我在法線目前的方向增加。它們應該通常是相同的顏色,但它們明顯不同。似乎mTBN矩陣並未正確地將切線空間正常轉換爲世界(和通常查看)空間。

+0

這可能是一個愚蠢的問題,但是你是否應該在頂點着色器中通過'mVW'來轉換'tnormal'? – Jadh4v

+0

嘗試這並不解決它。我認爲'mNormal'處理這個問題,因爲它是mVW的逆轉置。 – Ruxify

+0

嘗試反轉'nmapcolor.y = 1 - nmapcolor.y',也許你在某處y軸是向上或向下約定混合的。 – ybungalobill

回答

0

嗯......我解決了這個問題。原來我的正常映射實現是完美的。這個問題實際上是在我的紋理類中。這當然是我第一次編寫OpenGL渲染引擎,並且我沒有意識到我的紋理類中的unlock()函數將所有紋理保存爲GL_SRGB_ALPHA,包括法線貼圖。只有漫反射貼圖紋理應該是GL_SRGB_ALPHA。暫時強制所有紋理加載,因爲GL_RGBA解決了這個問題。 不能相信我有這個問題11個月,只是發現它是如此之小。