法线转换,但照明仍然很奇怪?

时间:2013-10-07 02:38:08

标签: java android opengl-es-2.0 shader

我有一个基本的模型查看器,它显示一个已解析的OBJ模型。我将灯放在相机所在的位置,因此正在观看的模型在一侧完全点亮。出于某种原因,我的转换没有按照我在渲染器中的预期进行。当我将模型绕x轴或y轴旋转90度时,网格完全变暗。但旋转另一个90度,它再次完全点亮。

我做的转换错了吗?或者我的法线错误开始了吗?


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


我计算并应用了正确的变换到我的应用程序中的法线(转换了ModelView矩阵的逆矩阵)

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

1 个答案:

答案 0 :(得分:0)

我知道它已经有一段时间了,但我找到了解决方案。问题是我的顶点着色器中的这一行:

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

我把它改为:

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

一切正常。虽然我不知道为什么第二行应该在第一行应用时。