efl/src/modules/evas/engines/gl_common/shader_3d/phong_frag.shd

104 lines
2.1 KiB
Plaintext

varying vec3 vLightVector;
varying vec3 vLightHalfVector;
varying vec3 vNormal;
FRAGMENT_SHADER_USE_TEX_COORD
FRAGMENT_SHADER_USE_FOG
FRAGMENT_SHADER_USE_SHADOWS
FRAGMENT_SHADER_USE_DIFFUSE_TERM
FRAGMENT_SHADER_USE_SPECULAR_TERM
FRAGMENT_SHADER_USE_AMBIENT_TERM
FRAGMENT_SHADER_USE_EMISSION_TERM
FRAGMENT_SHADER_USE_LIGHT
FRAGMENT_SHADER_USE_ALPHA_TEST_GLES
vec4 fragmentPhong()
{
vec3 normal = normalize(vNormal);
vec3 lv = normalize(vLightVector);
float factor = dot(lv, normal);
vec4 color;
vec4 fragcolor;
#ifdef LIGHT_SPOT
float f = dot(-lv, normalize(uLightSpotDir));
if (f > uLightSpotCutoffCos)
factor *= pow(f, uLightSpotExp);
else
factor = 0.0;
#endif //LIGHT_SPOT
if (factor > 0.0)
{
/* Diffuse term. */
#ifdef DIFFUSE
FRAGMENT_SHADER_TEXTURE_BLEND(DIFFUSE, Diffuse)
fragcolor = uLightDiffuse * color * factor;
#else
fragcolor = vec4(0.0, 0.0, 0.0, 0.0);
#endif //DIFFUSE
/* Specular term. */
#ifdef SPECULAR
factor = dot(normalize(vLightHalfVector), normal);
if (factor > 0.0)
{
factor = pow(factor, uMaterialShininess);
FRAGMENT_SHADER_TEXTURE_BLEND(SPECULAR, Specular)
fragcolor += uLightSpecular * color * factor;
}
#endif
}
else
fragcolor = vec4(0.0, 0.0, 0.0, 0.0);
#ifdef SHADOWED
fragcolor *= shadow;
#endif //SHADOWED
#ifdef AMBIENT
FRAGMENT_SHADER_TEXTURE_BLEND(AMBIENT, Ambient)
fragcolor += uLightAmbient * color;
#endif
/* Light attenuation. */
#ifdef LIGHT_ATTENUATION
fragcolor /= dot(uLightAtten, vec3(1.0, vLightDist, vLightDist * vLightDist));
#endif
/* Emission term. */
#ifdef EMISSION
FRAGMENT_SHADER_TEXTURE_BLEND(EMISSION, Emission)
fragcolor += color;
#endif
return fragcolor;
}
void main()
{
vec4 color;
#ifdef SHADOWED
shadow = pcf(vLightPosition);
#endif //SHADOWED
color = fragmentPhong();
#ifdef ALPHA_TEST_ENABLED
FRAGMENT_SHADER_ALPHA_TEST_GLES_APPLY(color)
#else
gl_FragColor = color;
#endif //ALPHA_TEST_ENABLED
FRAGMENT_SHADER_FOG_APPLY
}