OpenGL ES 2.0 зеркальное освещение

Это мой самый первый пост здесь, но я бьюсь головой о стену, пытаясь решить эту проблему. Код ниже - мой фрагментный шейдер для невероятно простого приложения Opengl es 2.0. Вершинный шейдер делает все обычные дела. Проблема в зеркальном выделении: он выполняет вычисления на основе отдельных вершин, а не фрагментов. Если бы кто-нибудь мог объяснить мне, почему это происходит, я был бы очень признателен. Благодарю.

Кстати, извините за неэффективный код, я просто возвращался к основам освещения, чтобы попытаться отследить эту проблему.

precision highp float;

struct DirectionLight
{
    vec4 Ambient;
    vec4 Diffuse;
    vec4 Specular;
};

struct Material
{
    vec4 Ambient;
    vec4 Diffuse;
    vec4 Specular;
    float SpecularExponent;
};

const float c_zero = 0.0;
const float c_one  = 1.0;

uniform DirectionLight   u_directionLight;
uniform Material         u_material;
uniform sampler2D        u_texture;
uniform vec3             u_lightPosition;
uniform vec3             u_eyePosition;

varying vec3             v_position;
varying vec3             v_normal;
varying vec2             v_texCoord;

void main()
{
    vec4 totalLight = vec4(c_zero, c_zero, c_zero, c_zero);
    vec4 ambient    = vec4(c_zero, c_zero, c_zero, c_zero);
    vec4 diffuse    = vec4(c_zero, c_zero, c_zero, c_zero);
    vec4 specular   = vec4(c_zero, c_zero, c_zero, c_zero);
    vec3 halfPlane  = vec3(c_zero, c_zero, c_zero);

    halfPlane = normalize(u_eyePosition + u_lightPosition);

    float distance    = length(u_lightPosition - v_position);
    float attenuation = c_one / (c_one + (0.1 * distance) + (0.01 * distance * distance));

    vec3 lightVector = normalize(u_lightPosition - v_position);

    float ndotl = max(dot(v_normal, lightVector), 0.1);
    float ndoth = max(dot(v_normal, halfPlane), 0.1);

    ambient = u_directionLight.Ambient * u_material.Ambient;
    diffuse = ndotl * u_directionLight.Diffuse * u_material.Diffuse;

    if(ndoth > c_zero)
    {
        specular = pow(ndoth, u_material.SpecularExponent) * u_directionLight.Specular * u_material.Specular;
    }

    totalLight = ambient + ((diffuse + specular) * attenuation);

    gl_FragColor = totalLight;// * (texture2D(u_texture, v_texCoord));
}

1 ответ

Я думаю, что это может помочь вам с диффузным освещением http://www.learnopengles.com/android-lesson-two-ambient-and-diffuse-lighting/

Другие вопросы по тегам