From 0dc1aec50940140e28f434c524296e284e73d623 Mon Sep 17 00:00:00 2001 From: RealBadAngel Date: Fri, 21 Mar 2014 01:32:00 +0100 Subject: Normal maps generation on the fly. Parallax mapping with slope information. Overriding normal maps. --- client/shaders/liquids_shader/opengl_vertex.glsl | 67 ++++++++++++++++++++---- 1 file changed, 57 insertions(+), 10 deletions(-) (limited to 'client/shaders/liquids_shader/opengl_vertex.glsl') diff --git a/client/shaders/liquids_shader/opengl_vertex.glsl b/client/shaders/liquids_shader/opengl_vertex.glsl index e8f185825..9d64ce4e3 100644 --- a/client/shaders/liquids_shader/opengl_vertex.glsl +++ b/client/shaders/liquids_shader/opengl_vertex.glsl @@ -1,40 +1,84 @@ uniform mat4 mWorldViewProj; uniform mat4 mInvWorld; uniform mat4 mTransWorld; +uniform mat4 mWorld; + uniform float dayNightRatio; uniform float animationTimer; uniform vec3 eyePosition; varying vec3 vPosition; +varying vec3 worldPosition; + varying vec3 eyeVec; +varying vec3 lightVec; + +varying vec3 tsEyeVec; +varying vec3 tsLightVec; + +const float BS = 10.0; void main(void) { + gl_TexCoord[0] = gl_MultiTexCoord0; + #ifdef ENABLE_WAVING_WATER vec4 pos2 = gl_Vertex; pos2.y -= 2.0; pos2.y -= sin (pos2.z/WATER_WAVE_LENGTH + animationTimer * WATER_WAVE_SPEED * WATER_WAVE_LENGTH) * WATER_WAVE_HEIGHT + sin ((pos2.z/WATER_WAVE_LENGTH + animationTimer * WATER_WAVE_SPEED * WATER_WAVE_LENGTH) / 7.0) * WATER_WAVE_HEIGHT; gl_Position = mWorldViewProj * pos2; + vPosition = gl_Position.xyz; #else gl_Position = mWorldViewProj * gl_Vertex; + vPosition = gl_Position.xyz; #endif + worldPosition = (mWorld * gl_Vertex).xyz; + vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0); + + vec3 normal, tangent, binormal; + normal = normalize(gl_NormalMatrix * gl_Normal); + if (gl_Normal.x > 0.5) { + // 1.0, 0.0, 0.0 + tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, -1.0)); + binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); + } else if (gl_Normal.x < -0.5) { + // -1.0, 0.0, 0.0 + tangent = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); + binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); + } else if (gl_Normal.y > 0.5) { + // 0.0, 1.0, 0.0 + tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); + binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); + } else if (gl_Normal.y < -0.5) { + // 0.0, -1.0, 0.0 + tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); + binormal = normalize(gl_NormalMatrix * vec3( 0.0, 0.0, 1.0)); + } else if (gl_Normal.z > 0.5) { + // 0.0, 0.0, 1.0 + tangent = normalize(gl_NormalMatrix * vec3( 1.0, 0.0, 0.0)); + binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); + } else if (gl_Normal.z < -0.5) { + // 0.0, 0.0, -1.0 + tangent = normalize(gl_NormalMatrix * vec3(-1.0, 0.0, 0.0)); + binormal = normalize(gl_NormalMatrix * vec3( 0.0, -1.0, 0.0)); + } + mat3 tbnMatrix = mat3( tangent.x, binormal.x, normal.x, + tangent.y, binormal.y, normal.y, + tangent.z, binormal.z, normal.z); + + lightVec = sunPosition - worldPosition; + tsLightVec = lightVec * tbnMatrix; eyeVec = (gl_ModelViewMatrix * gl_Vertex).xyz; - vPosition = (mWorldViewProj * gl_Vertex).xyz; + tsEyeVec = eyeVec * tbnMatrix; vec4 color; - //color = vec4(1.0, 1.0, 1.0, 1.0); - float day = gl_Color.r; float night = gl_Color.g; float light_source = gl_Color.b; - /*color.r = mix(night, day, dayNightRatio); - color.g = color.r; - color.b = color.r;*/ - float rg = mix(night, day, dayNightRatio); rg += light_source * 2.5; // Make light sources brighter float b = rg; @@ -54,10 +98,13 @@ void main(void) color.r = clamp(rg,0.0,1.0); color.g = clamp(rg,0.0,1.0); color.b = clamp(b,0.0,1.0); + + // Make sides and bottom darker than the top + color = color * color; // SRGB -> Linear + if(gl_Normal.y <= 0.5) + color *= 0.6; + color = sqrt(color); // Linear -> SRGB color.a = gl_Color.a; gl_FrontColor = gl_BackColor = color; - - gl_TexCoord[0] = gl_MultiTexCoord0; - } -- cgit v1.2.3