forked from enlightenment/efl
148 lines
3.5 KiB
Plaintext
148 lines
3.5 KiB
Plaintext
varying vec3 vLightVector;
|
|
varying vec3 vLightHalfVector;
|
|
varying vec3 vEyeVector;
|
|
|
|
FRAGMENT_SHADER_USE_TEX_COORD
|
|
FRAGMENT_SHADER_USE_FOG
|
|
FRAGMENT_SHADER_USE_SHADOWS
|
|
FRAGMENT_SHADER_USE_TEXTURE(NORMAL, Normal)
|
|
FRAGMENT_SHADER_USE_ALPHA_TEST_GLES
|
|
|
|
#ifndef VERTEX_TANGENT
|
|
varying vec3 vNormal;
|
|
#endif //VERTEX_TANGENT
|
|
|
|
FRAGMENT_SHADER_USE_DIFFUSE_TERM
|
|
FRAGMENT_SHADER_USE_SPECULAR_TERM
|
|
FRAGMENT_SHADER_USE_AMBIENT_TERM
|
|
FRAGMENT_SHADER_USE_EMISSION_TERM
|
|
FRAGMENT_SHADER_USE_LIGHT
|
|
|
|
#ifndef VERTEX_TANGENT
|
|
|
|
mat3 cotangent_frame(vec3 n, vec3 p, vec2 uv)
|
|
{
|
|
vec3 dp1 = dFdx(p);
|
|
vec3 dp2 = dFdy(p);
|
|
vec2 duv1 = dFdx(uv);
|
|
vec2 duv2 = dFdy(uv);
|
|
vec3 dp2perp = cross(dp2, n);
|
|
vec3 dp1perp = cross(n, dp1);
|
|
vec3 t = dp2perp * duv1.x + dp1perp * duv2.x;
|
|
vec3 b = dp2perp * duv1.y + dp1perp * duv2.y;
|
|
float invmax = inversesqrt(max(dot(t, t), dot(b, b)));
|
|
return mat3(t * invmax, b * invmax, n);
|
|
}
|
|
|
|
vec3 perturb_normal(vec3 normal)
|
|
{
|
|
mat3 tbn = cotangent_frame(vNormal, -vEyeVector, vTexCoord);
|
|
return normalize(tbn * normal);
|
|
}
|
|
#endif //VERTEX_TANGENT
|
|
|
|
vec4 fragmentNormalMap()
|
|
{
|
|
float factor;
|
|
vec3 normal;
|
|
vec4 color;
|
|
vec4 fragcolor;
|
|
|
|
vec3 Tex0CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal0;
|
|
#ifdef NORMAL_TEXTURE_BLEND
|
|
vec3 Tex1CoordNormal = vec3(vTexCoord, 1.0) * uTextureMatrixTransformNormal1;
|
|
normal = texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).rgb * uTextureNormalWeight / texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).a;
|
|
normal += texture2D(uTextureNormal1, vec2(Tex1CoordNormal)).rgb / texture2D(uTextureNormal1, vec2(Tex1CoordNormal)).a *
|
|
(1.0 - uTextureNormalWeight);
|
|
#else
|
|
normal = texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).rgb / texture2D(uTextureNormal0, vec2(Tex0CoordNormal)).a;
|
|
#endif //NORMAL_TEXTURE_BLEND
|
|
|
|
normal = 2.0 * normal - 1.0;
|
|
|
|
#ifndef VERTEX_TANGENT
|
|
normal = perturb_normal(normal);
|
|
#endif //VERTEX_TANGENT
|
|
|
|
vec3 lv = normalize(vLightVector);
|
|
normal = normalize(normal);
|
|
|
|
factor = dot(lv, normal);
|
|
|
|
#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)
|
|
{
|
|
|
|
#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
|
|
|
|
#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 //SPECULAR
|
|
|
|
#ifdef SHADOWED
|
|
fragcolor *= shadow;
|
|
#endif //SHADOWED
|
|
|
|
}
|
|
else
|
|
fragcolor = vec4(0.0, 0.0, 0.0, 0.0);
|
|
|
|
#ifdef AMBIENT
|
|
FRAGMENT_SHADER_TEXTURE_BLEND(AMBIENT, Ambient)
|
|
fragcolor += uLightAmbient * color;
|
|
#endif //AMBIENT
|
|
|
|
#ifdef LIGHT_ATTENUATION
|
|
fragcolor /= dot(uLightAtten, vec3(1.0, vLightDist, vLightDist * vLightDist));
|
|
#endif //LIGHT_ATTENUATION
|
|
|
|
#ifdef EMISSION
|
|
|
|
FRAGMENT_SHADER_TEXTURE_BLEND(EMISSION, Emission)
|
|
fragcolor += color;
|
|
|
|
#endif //EMISSION
|
|
return fragcolor;
|
|
}
|
|
|
|
void main() {
|
|
vec4 color;
|
|
#ifdef SHADOWED
|
|
shadow = pcf(vLightPosition);
|
|
#endif //SHADOWED
|
|
|
|
color = fragmentNormalMap();
|
|
#ifdef ALPHA_TEST_ENABLED
|
|
FRAGMENT_SHADER_ALPHA_TEST_GLES_APPLY(color)
|
|
#else
|
|
gl_FragColor = color;
|
|
#endif //ALPHA_TEST_ENABLED
|
|
|
|
FRAGMENT_SHADER_FOG_APPLY
|
|
|
|
}
|
|
|