00001
00002 varying vec4 vColour;
00003 varying vec3 vEye;
00004 varying vec3 vLightDir;
00005 varying vec3 vHalf;
00006 varying vec3 vSpot;
00007 varying float vDist;
00008
00009 attribute vec3 tangent;
00010
00011 uniform int vShadowCount;
00012 varying vec4 vProjected;
00013
00014 void main()
00015 {
00016
00017 vColour = gl_Color * gl_FrontMaterial.diffuse;
00018
00019
00020 gl_TexCoord[0] = gl_MultiTexCoord0;
00021
00022
00023 vec3 vN = normalize( gl_NormalMatrix * gl_Normal );
00024
00025
00026 vec4 vPos = gl_ModelViewMatrix * gl_Vertex;
00027
00028
00029 vec3 vTmp = gl_LightSource[0].position.xyz - vPos.xyz;
00030
00031
00032 vDist = length( vTmp );
00033
00034
00035
00036
00037 vec3 vT = normalize( gl_NormalMatrix * tangent );
00038
00039
00040 vec3 vB = cross( vN, vT );
00041
00042
00043 vLightDir.x = dot( vTmp, vT );
00044 vLightDir.y = dot( vTmp, vB );
00045 vLightDir.z = dot( vTmp, vN );
00046
00047
00048 vTmp = gl_LightSource[0].halfVector.xyz;
00049 vHalf.x = dot( vTmp, vT );
00050 vHalf.y = dot( vTmp, vB );
00051 vHalf.z = dot( vTmp, vN );
00052
00053
00054 vTmp = gl_LightSource[0].spotDirection;
00055 vSpot.x = dot( vTmp, vT );
00056 vSpot.y = dot( vTmp, vB );
00057 vSpot.z = dot( vTmp, vN );
00058
00059
00060 vTmp = -vPos.xyz;
00061 vEye.x = dot( vTmp, vT );
00062 vEye.y = dot( vTmp, vB );
00063 vEye.z = dot( vTmp, vN );
00064
00065
00066
00067
00068 vProjected = gl_TextureMatrix[1] * vPos;
00069
00070
00071 gl_Position = ftransform();
00072 }
00073
00074 ~~~~~
00075
00076 varying vec4 vColour;
00077 varying vec3 vEye;
00078 varying vec3 vLightDir;
00079 varying vec3 vHalf;
00080 varying vec3 vSpot;
00081 varying float vDist;
00082
00083 uniform sampler2D Texture0;
00084 uniform sampler2DShadow Texture1;
00085
00086 uniform int vShadowCount;
00087 varying vec4 vProjected;
00088
00089 #define KERNEL_SIZE 3.0
00090 #define KERNEL_AREA 16.0
00091 #define BLUR 0.003
00092
00093 void main()
00094 {
00095
00096 vec4 vBase = vec4( 0.0, 0.0, 0.0, 1.0 );
00097 vec4 vLight = vec4( 0.0, 0.0, 0.0, 1.0 );
00098
00099
00100 if ( vShadowCount > 0 )
00101 {
00102
00103 vec3 tmp = vProjected.xyz / vProjected.w;
00104
00105
00106 if ( tmp.x >= 0.0 && tmp.x <= 1.0 && tmp.y >= 0.0 && tmp.y <= 1.0 )
00107 {
00108
00109
00110 for ( float x = -KERNEL_SIZE + 1.0; x < KERNEL_SIZE; x += 1.0 )
00111 {
00112 for ( float y = -KERNEL_SIZE + 1.0; y < KERNEL_SIZE; y += 1.0 )
00113 {
00114 vBase += shadow2D( Texture1, tmp + vec3( BLUR * x, BLUR * y, 0 ) );
00115 }
00116 }
00117 vBase /= KERNEL_AREA;
00118 }
00119 }
00120
00121
00122 vec3 vN = normalize( texture2D( Texture0, gl_TexCoord[0].xy ).xyz * 2.0 - 1.0 );
00123 vN.y = -vN.y;
00124
00125
00126 vec3 vL = normalize( vLightDir );
00127
00128
00129 float NdotL = dot( vN, vL );
00130
00131
00132 float att = 0.0;
00133
00134
00135 if ( NdotL > 0.0 )
00136 {
00137
00138 vec3 vS = normalize( vSpot );
00139
00140
00141 float effect = dot( vS, -vL );
00142
00143
00144 if ( effect > gl_LightSource[0].spotCosCutoff )
00145 {
00146
00147 effect = pow( effect, gl_LightSource[0].spotExponent );
00148
00149
00150 att = effect / ( gl_LightSource[0].constantAttenuation +
00151 gl_LightSource[0].linearAttenuation * vDist +
00152 gl_LightSource[0].quadraticAttenuation * vDist * vDist );
00153
00154
00155 vLight = att * NdotL * gl_LightSource[0].diffuse;
00156
00157
00158 vec3 vH = normalize( vHalf );
00159
00160
00161 NdotL = max( dot( vN, vH ), 0.0 );
00162
00163
00164 vLight += att *
00165 pow( NdotL, gl_FrontMaterial.shininess ) *
00166 gl_FrontMaterial.specular *
00167 gl_LightSource[0].specular;
00168 }
00169 }
00170
00171
00172 gl_FragColor = vec4( vBase.xyz, 1 ) * vLight;
00173 }