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

89 lines
1.9 KiB
Plaintext

uniform mat4 uMatrixMvp;
uniform mat3 uMatrixNormal;
uniform mat4 uMatrixModelview;
uniform vec4 uLightPosition;
varying vec3 vLightVector;
varying vec3 vLightHalfVector;
varying vec3 vEyeVector;
VERTEX_SHADER_USE_SHADOWS
VERTEX_SHADER_USE_POSITION
VERTEX_SHADER_USE_NORMALS
#ifdef VERTEX_TANGENT
attribute vec4 aTangent0;
#endif //VERTEX_TANGENT
#ifdef VERTEX_TANGENT_BLEND
attribute vec4 aTangent1;
uniform float uTangentWeight;
#endif //VERTEX_TANGENT_BLEND
VERTEX_SHADER_USE_TEXCOORD
VERTEX_SHADER_NEED_TEX_COORD
VERTEX_SHADER_USE_LIGHT_ATTENUATION
void vertexParallaxOcclusion(vec4 position, vec3 normal, vec3 tangent)
{
vec3 n = normalize(uMatrixNormal * normal);
vec3 t = normalize(uMatrixNormal * tangent);
vec3 b = cross(n, t);
vec3 tmp;
position = uMatrixModelview * position;
#ifdef LIGHT_DIRECTIONAL
vec3 lightDir = uLightPosition.xyz;
#else
vec3 lightDir = uLightPosition.xyz - position.xyz;
#ifdef LIGHT_ATTENUATION
vLightDist = length(lightDir);
#endif //LIGHT_ATTENUATION
lightDir = normalize(lightDir);
#endif //LIGHT_DIRECTIONAL
tmp.x = dot(lightDir, t);
tmp.y = dot(lightDir, b);
tmp.z = dot(lightDir, n);
vLightVector = tmp;
tmp.x = dot(position.xyz, t);
tmp.y = dot(position.xyz, b);
tmp.z = dot(position.xyz, n);
vEyeVector = normalize(tmp);
vec3 hv = normalize(normalize(-position.xyz) + lightDir);
tmp.x = dot(hv, t);
tmp.y = dot(hv, b);
tmp.z = dot(hv, n);
vLightHalfVector = tmp;
}
void main()
{
VERTEX_SHADER_POSITION
VERTEX_SHADER_NORMAL
#ifdef VERTEX_TANGENT_BLEND
vec3 tangent = aTangent0.xyz * uTangentWeight +
aTangent1.xyz * (1.0 - uTangentWeight);
#else
#ifdef VERTEX_TANGENT
vec3 tangent = aTangent0.xyz;
#endif //VERTEX_TANGENT
#endif //VERTEX_TANGENT_BLEND
VERTEX_SHADER_TEXCOORD
gl_Position = uMatrixMvp * position;
vertexParallaxOcclusion(position, normal, tangent);
VERTEX_SHADER_SHADOWED
}