我目前正在研究我的第一個基於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;
}
}
計算在頂點着色器 的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」是從正常的地圖樣本顏色。 然後在照明計算中使用「正常」。
我一直在試圖解決這個問題這麼久,絕對不知道如何讓這個工作。任何幫助將不勝感激。
編輯 - 我稍微修改了代碼以在世界空間中工作並輸出結果。大平臺沒有正常的映射(並且它工作正常),而較小的平臺卻沒有。
我在法線目前的方向增加。它們應該通常是相同的顏色,但它們明顯不同。似乎mTBN矩陣並未正確地將切線空間正常轉換爲世界(和通常查看)空間。
這可能是一個愚蠢的問題,但是你是否應該在頂點着色器中通過'mVW'來轉換'tnormal'? – Jadh4v
嘗試這並不解決它。我認爲'mNormal'處理這個問題,因爲它是mVW的逆轉置。 – Ruxify
嘗試反轉'nmapcolor.y = 1 - nmapcolor.y',也許你在某處y軸是向上或向下約定混合的。 – ybungalobill