forked from Mirrorlandia_minetest/irrlicht
62 lines
1.7 KiB
V Shell
62 lines
1.7 KiB
V Shell
|
#define MAX_LIGHTS 2
|
||
|
|
||
|
/* Attributes */
|
||
|
|
||
|
attribute vec3 inVertexPosition;
|
||
|
attribute vec3 inVertexNormal;
|
||
|
attribute vec3 inVertexTangent;
|
||
|
attribute vec3 inVertexBinormal;
|
||
|
attribute vec4 inVertexColor;
|
||
|
attribute vec2 inTexCoord0;
|
||
|
|
||
|
/* Uniforms */
|
||
|
|
||
|
uniform mat4 uWVPMatrix;
|
||
|
uniform mat4 uWVMatrix;
|
||
|
uniform vec3 uEyePosition;
|
||
|
uniform vec3 uLightPosition[MAX_LIGHTS];
|
||
|
uniform vec4 uLightColor[MAX_LIGHTS];
|
||
|
|
||
|
/* Varyings */
|
||
|
|
||
|
varying vec2 vTexCoord;
|
||
|
varying vec3 vEyeVector;
|
||
|
varying vec3 vLightVector[MAX_LIGHTS];
|
||
|
varying vec4 vLightColor[MAX_LIGHTS];
|
||
|
varying float vFogCoord;
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
gl_Position = uWVPMatrix * vec4(inVertexPosition, 1.0);
|
||
|
|
||
|
vTexCoord = inTexCoord0;
|
||
|
|
||
|
vec3 EyeVector = uEyePosition - inVertexPosition;
|
||
|
|
||
|
vEyeVector.x = dot(inVertexTangent, EyeVector);
|
||
|
vEyeVector.y = dot(inVertexBinormal, EyeVector);
|
||
|
vEyeVector.z = dot(inVertexNormal, EyeVector);
|
||
|
vEyeVector *= vec3(1.0, -1.0, -1.0);
|
||
|
|
||
|
for (int i = 0; i < int(MAX_LIGHTS); i++)
|
||
|
{
|
||
|
vec3 LightVector = uLightPosition[i] - inVertexPosition;
|
||
|
|
||
|
vLightVector[i].x = dot(inVertexTangent, LightVector);
|
||
|
vLightVector[i].y = dot(inVertexBinormal, LightVector);
|
||
|
vLightVector[i].z = dot(inVertexNormal, LightVector);
|
||
|
|
||
|
vLightColor[i].x = dot(LightVector, LightVector);
|
||
|
vLightColor[i].x *= uLightColor[i].a;
|
||
|
vLightColor[i] = vec4(inversesqrt(vLightColor[i].x));
|
||
|
vLightColor[i] *= uLightColor[i];
|
||
|
vLightColor[i].a = inVertexColor.a;
|
||
|
|
||
|
vLightColor[i].x = clamp(vLightColor[i].x, 0.0, 1.0);
|
||
|
vLightColor[i].y = clamp(vLightColor[i].y, 0.0, 1.0);
|
||
|
vLightColor[i].z = clamp(vLightColor[i].z, 0.0, 1.0);
|
||
|
}
|
||
|
|
||
|
vFogCoord = length((uWVMatrix * vec4(inVertexPosition, 1.0)).xyz);
|
||
|
}
|