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/