2013-10-07 3 views
1

У меня есть базовая модель, которая отображает анализируемую модель OBJ. У меня есть свет, где находится камера, поэтому просматриваемая модель полностью горит с одной стороны. По какой-то причине мои преобразования не делают то, что я ожидал в моем рендерере. Когда я поворачиваю свою модель на 90 градусов вокруг оси x или y, сетка полностью темная. Но поверните еще на 90 градусов, и снова его снова зажгите.Нормальные преобразования, но освещение все еще странно?

Я делаю преобразования неправильно? Или мои нормали неправильно начинать?


enter image description here
enter image description here
enter image description here
enter image description here


Я подсчитал, и применил правильное преобразование нормалей в моем приложении (транспонированный обратной матрицы видовой)

Matrix.invertM(mNormalMatrix, 0, mMVMatrix, 0); 
Matrix.transposeM(mNormalMatrix, 0, mNormalMatrix, 0); 

перед передачей его в свои шейдеры:

/*Vertex shader*/ 
attribute vec3 vPosition; 
attribute vec3 vNormal; 
uniform mat4 modelViewMatrix; 
uniform mat4 mMVPMatrix; 
uniform mat4 mViewMatrix; 
uniform mat4 normalMatrix; 
uniform float lightingEnabled; 

varying float lightsEnabled; 
varying vec3 lightPosEye; 
varying vec3 normalEye; 
varying vec3 vertEye; 

void main() { 

    /*Calculate normal matrix*/ 
    vec4 normal = vec4(vNormal, 0.0); 
    normalEye = normalize(vec3(normalMatrix * normal)); 

    lightsEnabled = lightingEnabled; 

    lightPosEye = vec3(mViewMatrix * vec4(0.0, 0.0, 3.0, 1.0)); 

    vertEye = vec3(modelViewMatrix * vec4(vPosition, 1.0)); 

    gl_Position = mMVPMatrix * vec4(vPosition, 1.0); 
} 


/*Fragment shader*/ 

precision mediump float; 
/*uniform vec4 vColor; */ 

varying float lightsEnabled; 
varying vec3 lightPosEye; 
varying vec3 normalEye; 
varying vec3 vertEye; 

void main() { 

    /*Light output components*/ 
    vec3 Ia; 
    vec3 Id; 

    /*light source components*/ 
    vec3 La = vec3(0.5); 
    vec3 Ld = vec3(1.0); 
    /*vec3 Ls = vec3(1.0);*/ 

    vec3 Ka = vec3(0.3); /*ambient reflectance term*/ 
    vec3 Kd = vec3(1.0); /*diffuse term*/ 

    /*ambient light term*/ 
    Ia = La * Ka; 

    float dotProd; 
    vec3 lightToSurface; 

    if(lightsEnabled > 0.5){ 
     /*diffuse light term*/ 
     lightToSurface = normalize(lightPosEye - vertEye); 

     dotProd = dot(lightToSurface, normalEye); 
     dotProd = max(dotProd, 0.0); 
    } 
    else { 
     dotProd = 1.0; 
    } 

    Id = Ld * Kd * dotProd; 


    gl_FragColor = vec4(Ia + Id, 1.0); 
} 

ответ

0

Я знаю, что его было какое-то время, но я нашел решение. Проблема была эта линия в моей вершинных шейдеров:

normalEye = normalize(vec3(normalMatrix * normal)); 

Я изменил его:

normalEye = normalize(vec3(modelViewMatrix * normal)); 

и все работает отлично. Хотя я понятия не имею, почему вторая строка работает, когда первая должна.

Смежные вопросы