81 lines
2.7 KiB
V Shell
81 lines
2.7 KiB
V Shell
|
// Copyright (C) 2009-2010 Amundis
|
||
|
// Heavily based on the OpenGL driver implemented by Nikolaus Gebhardt
|
||
|
// and OpenGL ES driver implemented by Christian Stehno
|
||
|
// This file is part of the "Irrlicht Engine".
|
||
|
// For conditions of distribution and use, see copyright notice in Irrlicht.h
|
||
|
#define MAX_LIGHTS 2
|
||
|
|
||
|
attribute vec4 inVertexPosition;
|
||
|
attribute vec4 inVertexColor;
|
||
|
attribute vec4 inTexCoord0;
|
||
|
attribute vec3 inVertexNormal;
|
||
|
attribute vec3 inVertexTangent;
|
||
|
attribute vec3 inVertexBinormal;
|
||
|
|
||
|
uniform mat4 uMvpMatrix;
|
||
|
uniform vec4 uLightPos[MAX_LIGHTS];
|
||
|
uniform vec4 uLightColor[MAX_LIGHTS];
|
||
|
uniform vec3 uEyePos;
|
||
|
|
||
|
varying vec4 varTexCoord;
|
||
|
varying vec3 varLightVector[MAX_LIGHTS];
|
||
|
varying vec4 varLightColor[MAX_LIGHTS];
|
||
|
varying vec3 varEyeVector;
|
||
|
|
||
|
varying vec4 debug;
|
||
|
|
||
|
void main(void)
|
||
|
{
|
||
|
debug = vec4(inVertexNormal, 1.0);
|
||
|
// transform position to clip space
|
||
|
gl_Position = uMvpMatrix * inVertexPosition;
|
||
|
|
||
|
// vertex - lightpositions
|
||
|
vec4 tempLightVector0 = uLightPos[0] - inVertexPosition;
|
||
|
vec4 tempLightVector1 = uLightPos[1] - inVertexPosition;
|
||
|
|
||
|
// eye vector
|
||
|
vec4 Temp = vec4(uEyePos, 1.0) - inVertexPosition;
|
||
|
|
||
|
// transform the light vector 1 with U, V, W
|
||
|
varLightVector[0].x = dot(inVertexTangent, tempLightVector0.xyz);
|
||
|
varLightVector[0].y = dot(inVertexBinormal, tempLightVector0.xyz);
|
||
|
varLightVector[0].z = dot(inVertexNormal, tempLightVector0.xyz);
|
||
|
|
||
|
|
||
|
// transform the light vector 2 with U, V, W
|
||
|
varLightVector[1].x = dot(inVertexTangent, tempLightVector1.xyz);
|
||
|
varLightVector[1].y = dot(inVertexBinormal, tempLightVector1.xyz);
|
||
|
varLightVector[1].z = dot(inVertexNormal, tempLightVector1.xyz);
|
||
|
|
||
|
// transform the eye vector with U, V, W
|
||
|
varEyeVector.x = dot(inVertexTangent, Temp.xyz);
|
||
|
varEyeVector.y = dot(inVertexBinormal, Temp.xyz);
|
||
|
varEyeVector.z = dot(inVertexNormal, Temp.xyz);
|
||
|
varEyeVector *= vec3(1.0,-1.0, -1.0);
|
||
|
varEyeVector = normalize(varEyeVector);
|
||
|
|
||
|
// calculate attenuation of light 0
|
||
|
varLightColor[0].w = 0.0;
|
||
|
varLightColor[0].x = dot(tempLightVector0, tempLightVector0);
|
||
|
varLightColor[0].x *= uLightColor[0].w;
|
||
|
varLightColor[0] = vec4(inversesqrt(varLightColor[0].x));
|
||
|
varLightColor[0] *= uLightColor[0];
|
||
|
|
||
|
// normalize light vector 0
|
||
|
varLightVector[0] = normalize(varLightVector[0]);
|
||
|
|
||
|
// calculate attenuation of light 1
|
||
|
varLightColor[1].w = 0.0;
|
||
|
varLightColor[1].x = dot(tempLightVector1, tempLightVector1);
|
||
|
varLightColor[1].x *= uLightColor[1].w;
|
||
|
varLightColor[1] = vec4(inversesqrt(varLightColor[1].x));
|
||
|
varLightColor[1] *= uLightColor[1];
|
||
|
|
||
|
// normalize light vector 1
|
||
|
varLightVector[1] = normalize(varLightVector[1]);
|
||
|
|
||
|
// move out texture coordinates and original alpha value
|
||
|
varTexCoord = inTexCoord0;
|
||
|
varLightColor[0].a = inVertexColor.a;
|
||
|
}
|