//#version 110 uniform sampler2D ReflectionTexture; uniform sampler2D RefractionTexture; uniform sampler2D DudvMap; uniform sampler2D NormalMap; #ifdef USE_FEATURE_TEXTURE uniform sampler2D FeatureTexture; #endif #ifdef USE_TEXTURE uniform sampler2D Texture; #endif uniform vec4 WaterOffset; varying vec3 ViewVector; varying vec4 EyeCoords; #if defined(NO_HALF_TYPES) || !defined(__GLSL_CG_DATA_TYPES) # define half float # define half2 vec2 # define half3 vec3 # define half4 vec4 #endif #ifndef WATER_COLOR #define WATER_COLOR vec4( 0.6, 0.7, 1.0, 1.0 ) #endif float saturate( float x ) { return clamp( x, 0.0, 1.0 ); } float fresnel( vec3 Normal, vec3 EyeVector, vec3 ScaleBiasPower ) { return ScaleBiasPower.x * pow( saturate( dot( -Normal, EyeVector ) ), ScaleBiasPower.z ) + ScaleBiasPower.y; } void main( void ) { #ifdef USE_FEATURE_TEXTURE float Alpha = texture2D( FeatureTexture, gl_TexCoord[ 0 ].xy ).a; #endif #vec2 ScreenCoords = (EyeCoords.xy / EyeCoords.w) * 0.5 + 0.5; #const float kShine = 128.0; #const float kDistortion = 0.025; #const float kRefraction = 0.018; #vec4 distOffset = texture2D( DudvMap, ( gl_TexCoord[ 1 ].xy + WaterOffset.xy )*0.25 ) * kDistortion; vec4 dudvColor = texture2D( DudvMap, gl_TexCoord[ 1 ].xy - WaterOffset.xy + distOffset.xy ); dudvColor = normalize(dudvColor * 2.0 - 1.0) * kRefraction; vec3 Normal = normalize( texture2D( NormalMap, vec2(gl_TexCoord[ 1 ] - WaterOffset + distOffset)).xyz * 2.0 - 1.0 ); #float Fresnel = fresnel( Normal, normalize( ViewVector ), vec3( 1.0, 0.0, 0.5 ) ); // Get the actual texture coords for refraction and reflection vec2 ClipCoords = ScreenCoords; #ifdef USE_FEATURE_TEXTURE #dudvColor.st *= Alpha; #endif #ClipCoords += dudvColor.st; #ClipCoords = clamp( ClipCoords, 0.0, 1.0 ); // Get the texture values #vec4 RefractionColor = texture2D( RefractionTexture, ClipCoords ); #vec4 ReflectionColor = texture2D( ReflectionTexture, ClipCoords ); #gl_FragColor = mix( ReflectionColor, RefractionColor, Fresnel ); #gl_FragColor *= WATER_COLOR; gl_FragColor = vec4( 0.0, 0.0, 1.0, 1.0 ) #ifdef USE_TEXTURE gl_FragColor *= texture2D( Texture, gl_TexCoord[ 2 ].st + WaterOffset.xy ); #endif }