2012-06-09 269 views
2

我一直在嘗試使用OpenGL ES 2.0爲Android創建簡單的漫反射光照着色器,並從OpenGL 4.0着色語言食譜中獲取知識,但它並沒有涉及到很多關於正常矩陣的知識,而且我很確定問題出現因爲我一直使用的「模型」在WebGL中完美地工作,在那裏我可以使用我無法找到的非常漂亮的glMatrix庫。OpenGL正常矩陣

我不知道如何從模型視圖矩陣中獲得正常矩陣,但是我只讀了它的倒置3x3模型視圖矩陣的轉置,太差了Android矩陣類只允許您使用4x4矩陣(對吧?),所以我我一直在着色器中分割矩陣,這可能是我出錯的地方。

所以我做什麼,簡單說就是:

float[] nMatrix = new float[4 * 4]; 
    Matrix.invertM(nMatrix, 0, mvMatrix, 0); 
    Matrix.transposeM(nMatrix, 0, nMatrix, 0); 

    glUniformMatrix4fv(shader.getUniformPointer("nMatrix"), 1, false, nMatrix, 0); 

,然後在我的頂點着色器我這樣做:

tNorm = normalize(mat3(nMatrix) * vNormal).xyz; 

和代碼的其餘部分基本上是從書和結果低於

enter image description here

正如你可以看到一些SI des的立方體是非常黑暗的,我相信我甚至認爲我不知道任何Android GL調試器,但我知道所有的法線,但如果你知道一個,請隨時告訴我。

所以問題是,我怎樣才能從我的模型視圖矩陣正常的矩陣?

回答

3

我不是在哪裏可以找到Java中的Matrix庫來幫助你做到這一點。

但是,只要您的modelView矩陣不包含非均勻的比例尺,您可以安全地使用您的modelView矩陣而不是normalMatrix。

這可以幫助您開始使用,並確保您的問題不會隱藏在別處。

+0

感謝擡起頭,我會看到的。 – Ruuhkis

0

這可能是有用的

package com.CosmicCreations; 

public class Mat3x3 { 
public static float determinant(float []m){ 
return 
     + m[0] * (m[4] * m[8] - m[7] * m[5]) 
     - m[3] * (m[1] * m[8] - m[7] * m[2]) 
     + m[6] * (m[1] * m[5] - m[4] * m[2]); 
} 
public static void Mat3(float []m4, float[]m){ 
m[0]=m4[0]; m[1]=m4[1]; m[2]=m4[2]; 
m[3]=m4[4]; m[4]=m4[5]; m[5]=m4[6]; 
m[6]=m4[8]; m[7]=m4[9]; m[8]=m4[10]; 
} 
/* 
    Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]); 
    Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]); 
    Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]); 
    Inverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]); 
    Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]); 
    Inverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]); 
    Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]); 
    Inverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]); 
    Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]); 
    Inverse /= Determinant; 
*/ 
public static void inverse(float []m, float[] Inverse, int offset){ 

float Determinant = Mat3x3.determinant(m); 
Inverse[offset+0] = + (m[4] * m[8] - m[7] * m[5])/ Determinant; 
Inverse[offset+3] = - (m[3] * m[8] - m[6] * m[5])/ Determinant; 
Inverse[offset+6] = + (m[3] * m[7] - m[6] * m[4])/ Determinant; 
Inverse[offset+1] = - (m[1] * m[8] - m[7] * m[2])/ Determinant; 
Inverse[offset+4] = + (m[0] * m[8] - m[6] * m[2])/ Determinant; 
Inverse[offset+7] = - (m[0] * m[7] - m[6] * m[1])/ Determinant; 
Inverse[offset+2] = + (m[1] * m[5] - m[4] * m[2])/ Determinant; 
Inverse[offset+5] = - (m[0] * m[5] - m[3] * m[2])/ Determinant; 
Inverse[offset+8] = + (m[0] * m[4] - m[3] * m[1])/ Determinant; 
} 
public static void transpose(float []m, int offset, float[]result){ 
result[0] = m[offset+0]; 
result[1] = m[offset+3]; 
result[2] = m[offset+6]; 

result[3] = m[offset+1]; 
result[4] = m[offset+4]; 
result[5] = m[offset+7]; 

result[6] = m[offset+2]; 
result[7] = m[offset+5]; 
result[8] = m[offset+8]; 
} 
} 

應該這樣使用GLM庫一些有用的MAT3功能 -

// Invert + transpose of mvmatrix 
    float []temp = new float[18]; 
    Mat3x3.Mat3(mMVMatrix, temp); 
    Mat3x3.inverse(temp, temp, 9); 
    Mat3x3.transpose(temp, 9, normalMatrix);