OpenGLES 2.0 Phong着色器奇怪的结果,在启用纹理时使我的对象透明!

时间:2011-06-23 01:45:29

标签: android opengl-es-2.0 shader

我已经被困了好几天了,试图让我的着色器正常工作。 问题是,当我没有在我的物体上附加纹理时,我将环境乘以浅色,当没有光时我得到一个暗物体,并在光源被激活时正确照明。

问题在于,当我附加一个纹理并将其乘以环境光和浅色时,我得到一个透明对象,只有在光源被激活时才会出现,你甚至可以在它被照亮时透过它看到它! / p>

我一直在尝试从互联网上获得几个代码段,但我总是得到相同的结果。我在这里做错了什么?我很绝望......

该应用程序是在Android上开发的。

这是我的顶点着色器:

uniform mat4 uMVPMatrix;
uniform mat4 normalMatrix;

// eye pos
uniform vec3 eyePos;

// position and normal of the vertices
attribute vec4 aPosition;
attribute vec3 aNormal; 

// texture variables
uniform float hasTexture;
varying float tex;
attribute vec2 textureCoord;
varying vec2 tCoord;

// lighting
uniform vec4 lightPos;
uniform vec4 lightColor;

// material
uniform vec4 matAmbient;
uniform vec4 matDiffuse;
uniform vec4 matSpecular;
uniform float matShininess;

// normals to pass on
varying vec3 vNormal;
varying vec3 EyespaceNormal;

varying vec3 lightDir, eyeVec;

void main() {
    // pass on texture variables
    tex = hasTexture;
    tCoord = textureCoord;

    // normal
    EyespaceNormal = vec3(normalMatrix * vec4(aNormal, 1.0));

    // the vertex position
    vec4 position = uMVPMatrix * aPosition; 

    // light dir
    lightDir = lightPos.xyz - position.xyz;
    eyeVec = -position.xyz;

    gl_Position = uMVPMatrix * aPosition; 
}

这是我的片段着色器:

precision mediump float;

// texture variables
uniform sampler2D texture1; // color texture

varying float tex;
varying vec2 tCoord;

varying vec3 vNormal;
varying vec3 EyespaceNormal;

// light
uniform vec4 lightPos;
uniform vec4 lightColor;

// material
uniform vec4 matAmbient;
uniform vec4 matDiffuse;
uniform vec4 matSpecular;
uniform float matShininess;

// eye pos
uniform vec3 eyePos;

// from vertex s
varying vec3 lightDir, eyeVec;

void main() {

    vec4 b = lightColor;
    vec4 c = matAmbient;
    vec4 d = matDiffuse;
    vec4 e = matSpecular;
    vec3 g = eyePos;
    float f = matShininess;

    vec3 N = normalize(EyespaceNormal);
    vec3 E = normalize(eyeVec); 

    vec3 L = normalize(lightDir);

    // Reflect the vector. Use this or reflect(incidentV, N);
    vec3 reflectV = reflect(-L, N);

    // Get lighting terms
    vec4 ambientTerm;
    if (tex >= 1.0) {
        ambientTerm = texture2D(texture1, tCoord);
    }
    else
        ambientTerm = matAmbient * lightColor;

    vec4 diffuseTerm = matDiffuse * max(dot(N, L), 0.0);
    vec4 specularTerm = matSpecular * pow(max(dot(reflectV, E), 0.0), matShininess);

    gl_FragColor =  ambientTerm * diffuseTerm + specularTerm;
}

提前致谢。

1 个答案:

答案 0 :(得分:1)

好的,我发现了,多亏了JPD002,我再次修改了着色器,我发现它必须是

vec4 diffuseTerm = matDiffuse * max(dot(N, L), 0.0);
vec4 specularTerm = matSpecular * pow(max(dot(reflectV, E), 1.0), matShininess);

感谢JDP002,有4只眼睛看代码而不是2 = D

总是好的