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

это мой самый первый пост здесь, но я бьюсь головой о стену, пытаясь понять эту проблему. Код ниже — мой фрагментный шейдер для невероятно простого приложения OpenGL 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));
}

person Michael Dunleavy    schedule 11.05.2013    source источник
comment
Не могли бы вы поделиться фиксированным кодом.   -  person Nishant    schedule 09.06.2015


Ответы (1)


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

person Abby    schedule 11.05.2013
comment
Спасибо за ссылку, вчера я прочитал ее около сотни раз :) Я просмотрел как можно больше основ. Я исправил проблему сейчас, хотя :) - person Michael Dunleavy; 12.05.2013