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/plants_shader/opengl_fragment.glsl | 148 ++++++++++++++-------- client/shaders/plants_shader/opengl_vertex.glsl | 21 ++- 2 files changed, 108 insertions(+), 61 deletions(-) (limited to 'client/shaders/plants_shader') diff --git a/client/shaders/plants_shader/opengl_fragment.glsl b/client/shaders/plants_shader/opengl_fragment.glsl index 31981f9b9..817530a83 100644 --- a/client/shaders/plants_shader/opengl_fragment.glsl +++ b/client/shaders/plants_shader/opengl_fragment.glsl @@ -1,54 +1,94 @@ -uniform sampler2D baseTexture; -uniform sampler2D normalTexture; -uniform sampler2D useNormalmap; - -uniform vec4 skyBgColor; -uniform float fogDistance; -uniform vec3 eyePosition; - -varying vec3 vPosition; -varying vec3 eyeVec; - -const float e = 2.718281828459; - -void main (void) -{ - vec3 color; - vec2 uv = gl_TexCoord[0].st; - -#ifdef USE_NORMALMAPS - float use_normalmap = texture2D(useNormalmap,vec2(1.0,1.0)).r; -#endif - -#ifdef ENABLE_BUMPMAPPING - if (use_normalmap > 0.0) { - vec3 base = texture2D(baseTexture, uv).rgb; - vec3 vVec = normalize(eyeVec); - vec3 bump = normalize(texture2D(normalTexture, uv).xyz * 2.0 - 1.0); - vec3 R = reflect(-vVec, bump); - vec3 lVec = normalize(vVec); - float diffuse = max(dot(lVec, bump), 0.0); - float specular = pow(clamp(dot(R, lVec), 0.0, 1.0),1.0); - color = mix (base,diffuse*base,1.0) + 0.1 * specular * diffuse; - } else { - color = texture2D(baseTexture, uv).rgb; - } -#else - color = texture2D(baseTexture, uv).rgb; -#endif - - float alpha = texture2D(baseTexture, uv).a; - vec4 col = vec4(color.r, color.g, color.b, alpha); - col *= gl_Color; - col = col * col; // SRGB -> Linear - col *= 1.8; - col.r = 1.0 - exp(1.0 - col.r) / e; - col.g = 1.0 - exp(1.0 - col.g) / e; - col.b = 1.0 - exp(1.0 - col.b) / e; - col = sqrt(col); // Linear -> SRGB - if(fogDistance != 0.0){ - float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); - col = mix(col, skyBgColor, d); - } - gl_FragColor = vec4(col.r, col.g, col.b, alpha); -} +uniform sampler2D baseTexture; +uniform sampler2D normalTexture; +uniform sampler2D useNormalmap; + +uniform vec4 skyBgColor; +uniform float fogDistance; +uniform vec3 eyePosition; + +varying vec3 vPosition; +varying vec3 worldPosition; + +varying vec3 eyeVec; +varying vec3 lightVec; + +bool normalTexturePresent = false; + +const float e = 2.718281828459; + +float intensity (vec3 color){ + return (color.r + color.g + color.b) / 3.0; +} + +float get_rgb_height (vec2 uv){ + return intensity(texture2D(baseTexture,uv).rgb); +} + +vec4 get_normal_map(vec2 uv){ + vec4 bump = texture2D(normalTexture, uv).rgba; + bump.xyz = normalize(bump.xyz * 2.0 -1.0); + bump.y = -bump.y; + return bump; +} + +void main (void) +{ + vec3 color; + vec4 bump; + vec2 uv = gl_TexCoord[0].st; + bool use_normalmap = false; + +#ifdef USE_NORMALMAPS + if (texture2D(useNormalmap,vec2(1.0,1.0)).r > 0.0){ + bump = get_normal_map(uv); + use_normalmap = true; + } +#endif + +#ifdef GENERATE_NORMALMAPS + if (use_normalmap == false){ + float tl = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y+SAMPLE_STEP)); + float t = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y-SAMPLE_STEP)); + float tr = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y+SAMPLE_STEP)); + float r = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y)); + float br = get_rgb_height (vec2(uv.x+SAMPLE_STEP,uv.y-SAMPLE_STEP)); + float b = get_rgb_height (vec2(uv.x,uv.y-SAMPLE_STEP)); + float bl = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y-SAMPLE_STEP)); + float l = get_rgb_height (vec2(uv.x-SAMPLE_STEP,uv.y)); + float dX = (tr + 2.0 * r + br) - (tl + 2.0 * l + bl); + float dY = (bl + 2.0 * b + br) - (tl + 2.0 * t + tr); + bump = vec4 (normalize(vec3 (dX, -dY, NORMALMAPS_STRENGTH)),1.0); + use_normalmap = true; + } +#endif + +vec4 base = texture2D(baseTexture, uv).rgba; + +#ifdef ENABLE_BUMPMAPPING + if (use_normalmap){ + vec3 L = normalize(lightVec); + vec3 E = normalize(eyeVec); + float specular = pow(clamp(dot(reflect(L, bump.xyz), E), 0.0, 1.0),0.5); + float diffuse = dot(E,bump.xyz); + color = 0.05*base.rgb + diffuse*base.rgb + 0.2*specular*base.rgb; + } else { + color = base.rgb; + } +#else + color = base.rgb; +#endif + + vec4 col = vec4(color.rgb, base.a); + col = col * col; // SRGB -> Linear + col *= 1.8; + col.r = 1.0 - exp(1.0 - col.r) / e; + col.g = 1.0 - exp(1.0 - col.g) / e; + col.b = 1.0 - exp(1.0 - col.b) / e; + col = sqrt(col); // Linear -> SRGB + col *= gl_Color; + if(fogDistance != 0.0){ + float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0)); + col = mix(col, skyBgColor, d); + } + gl_FragColor = vec4(col.rgb, base.a); +} diff --git a/client/shaders/plants_shader/opengl_vertex.glsl b/client/shaders/plants_shader/opengl_vertex.glsl index 7987fc16d..a95c20242 100644 --- a/client/shaders/plants_shader/opengl_vertex.glsl +++ b/client/shaders/plants_shader/opengl_vertex.glsl @@ -1,13 +1,20 @@ 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; + +const float BS = 10.0; #ifdef ENABLE_WAVING_PLANTS float smoothCurve( float x ) { @@ -23,12 +30,11 @@ float smoothTriangleWave( float x ) { void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; #ifdef ENABLE_WAVING_PLANTS vec4 pos = gl_Vertex; - vec4 pos2 = mTransWorld * gl_Vertex; + vec4 pos2 = mWorld * gl_Vertex; if (gl_TexCoord[0].y < 0.05) { pos.x += (smoothTriangleWave(animationTimer * 20.0 + pos2.x * 0.1 + pos2.z * 0.1) * 2.0 - 1.0) * 0.8; pos.y -= (smoothTriangleWave(animationTimer * 10.0 + pos2.x * -0.5 + pos2.z * -0.5) * 2.0 - 1.0) * 0.4; @@ -38,9 +44,13 @@ void main(void) gl_Position = mWorldViewProj * gl_Vertex; #endif - vPosition = (mWorldViewProj * gl_Vertex).xyz; - eyeVec = (gl_ModelViewMatrix * gl_Vertex).xyz; + vPosition = gl_Position.xyz; + worldPosition = (mWorld * gl_Vertex).xyz; + vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0); + lightVec = sunPosition - worldPosition; + eyeVec = (gl_ModelViewMatrix * gl_Vertex).xyz; + vec4 color; //color = vec4(1.0, 1.0, 1.0, 1.0); @@ -76,11 +86,8 @@ void main(void) color = color * color; // SRGB -> Linear if(gl_Normal.y <= 0.5) color *= 0.6; - //color *= 0.7; color = sqrt(color); // Linear -> SRGB - color.a = gl_Color.a; gl_FrontColor = gl_BackColor = color; - } -- cgit v1.2.3