2012-06-09 3 views
2

나는 OpenGL ES 2.0을 사용하고 OpenGL 4.0 쉐이딩 언어 요리 책에서 지식을 얻는 간단한 확산 조명 쉐이더를 만들려고 노력해 왔지만 정상적인 매트릭스에 대해서는별로 알려주지 않고 문제가 올 것이라고 확신한다. "모델"을 사용하고 있기 때문에 WebGL에서 Java 용으로 찾을 수없는 멋진 glMatrix 라이브러리를 사용할 수 있습니다.OpenGL 일반 매트릭스

정상적인 매트릭스를 모델 뷰 매트릭스에서 어떻게 얻을 수 있는지 모르겠지만 너무 반전 된 3x3 조각의 modelview 매트릭스를 읽었습니다. 안드로이드 매트릭스 클래스는 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

이하 데스 큐브의 compeltely 어두운이며, 나는 심지어 모든 안드로이드 GL 디버거를 알지 못하는 줄 알았는데 모든 법선있어,하지만 당신이 하나를 알고 있다면, 그것에 대해 말해 자유롭게.

질문 : 그렇다면 모델 뷰 매트릭스에서 정상 매트릭스를 올바르게 얻으려면 어떻게해야합니까?

답변

3

여기에서 Java로 Matrix 라이브러리를 찾을 수있는 곳이 없습니다.

그러나 modelView 매트릭스에 비 균일 스케일이 포함되어 있지 않으면 normalMatrix 대신 modelView 매트릭스를 안전하게 사용할 수 있습니다.

이렇게하면 시작하는 데 도움이 될 수 있으며 문제가 다른 곳에 숨겨져 있지 않은지 확인할 수 있습니다.

+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);