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

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
}