Android OpenGL es 2.0高光灯

时间:2013-11-13 15:34:09

标签: java android opengl-es fragment-shader

我正在尝试为我的Android OpenGL项目添加镜面闪电,但是光线仅投射在我的对象的一部分上,正如您在我的示例中所见:

enter image description here

在我的片段着色器中,我计算颜色如下:

float dot(vec3 v1, vec3 v2)
{
    return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}

void main()
{
    float distSqr = dot(lightDir, lightDir);
    float att = clamp(1.0 - 0.001 * sqrt(distSqr), 0.0, 1.0);
    vec3 L = lightDir * inversesqrt(distSqr);

    vec4 baseColor = texture2D(texture1, tCoord);

    vec3 N = normalize(baseColor.xyz * 2.0 - 1.0);

    vec3 E = normalize(eyeVec);

    vec3 reflectV = reflect(-L, N);

    vec4 ambientTerm = baseColor;

    // base * diffuse * max(dot(N, L), 0.0)
    vec4 diffuseTerm = baseColor * matDiffuse * max(dot(N, L), 0.0);
    //vec4 diffuseTerm = baseColor * gl_FrontMaterial.diffuse * max(dot(N, L), 0.0);

    // spec * pow(max(dot(reflectV, E), 0.0), shininess)
    vec4 specularTerm = matSpecular * pow(max(dot(reflectV, E), 0.0), 5.0);
    //vec4 specularTerm = vec4(1.0, 1.0, 1.0, 1.0) * pow(max(dot(reflectV, E), 0.0), 5.0);

    gl_FragColor = (ambientTerm + diffuseTerm + specularTerm) * att;
}

灯光位置为:0,2,2

如果您需要更多信息,请提出要求。

1 个答案:

答案 0 :(得分:0)

问题是顶点着色器。

代码是:

EyespaceNormal = vec3(u_mvMatrix * vec4(a_normal, 1.0));
vec3 eyespaceTangent = vec3(u_mvMatrix * vec4(tangent, 1.0));

应该是

EyespaceNormal = vec3(mat3(u_mvMatrix) * a_normal);
vec3 eyespaceTangent = vec3(mat3(u_mvMatrix) * tangent);