开发者

OpenGLES 2.0 Phong shader strange result, makes my object transparent when texture is enabled!

开发者 https://www.devze.com 2023-03-14 16:08 出处:网络
I\'ve been stuck for several days now, trying to make my shader working properly. The problem is that when I\'m not attaching a texture on my object, I multiply the ambient by the light color and I ge

I've been stuck for several days now, trying to make my shader working properly. The problem is that when I'm not attaching a texture on my object, I multiply the ambient by the light color and I get a dark object when no light, and illuminated properly when a light source is activated.

The problem is that when I attach a texture and multiply it by ambient and light color I get a transparent object that shows up only when a light source is activated, and you can even see through the object while it is illuminated!

I've been trying several codes snippets from the internet but I always get the same result. What I'm doing wrong here? I'm desperate...

The application is developed on Android.

Here is my Vertex Shader:

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

And here is my Fragment shader:

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

Thanks in advance.


OK I found it, thanks to JPD002, I was revising the shader again, and I found out that it has to be

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

Thanks JDP002, it is always good to have 4 eyes on code rather than 2 =D

0

精彩评论

暂无评论...
验证码 换一张
取 消