# HG changeset patch # User John Tsiombikas # Date 1335065168 -10800 # Node ID aab0d8ea21cdeeeda1e91fc95ca51220a1476c87 # Parent c6a6a64df6dea4e5d2493b63547b64d922c27326 normalmap and sortof subsurface shader diff -r c6a6a64df6de -r aab0d8ea21cd sdr/vein.p.glsl --- a/sdr/vein.p.glsl Sun Apr 22 05:20:03 2012 +0300 +++ b/sdr/vein.p.glsl Sun Apr 22 06:26:08 2012 +0300 @@ -1,8 +1,13 @@ uniform sampler2D tex_norm; +uniform vec3 fog_col; varying vec3 vpos, vnorm; varying vec3 ldir, vdir; +const float fog_dens = 0.075; + +float fog(float dist); + void main() { vec3 tnorm = texture2D(tex_norm, gl_TexCoord[0].st).xyz * 2.0 - 1.0; @@ -14,5 +19,13 @@ vec3 diff = vec3(0.8, 0.25, 0.2) * (1.0 - max(dot(l, n), 0.0)); vec3 spec = 0.5 * vec3(0.9, 0.4, 0.3) * pow(max(dot(h, n), 0.0), 10.0); - gl_FragColor = vec4(diff + spec, 1.0); + vec3 color = mix(fog_col, diff + spec, fog(vpos.z)); + + gl_FragColor = vec4(color, 1.0); } + +#define LOG2E 1.442695 +float fog(float dist) +{ + return clamp(exp2(-fog_dens * fog_dens * dist * dist * LOG2E), 0.0, 1.0); +} diff -r c6a6a64df6de -r aab0d8ea21cd src/game.cc --- a/src/game.cc Sun Apr 22 05:20:03 2012 +0300 +++ b/src/game.cc Sun Apr 22 06:26:08 2012 +0300 @@ -6,6 +6,8 @@ #include "camera.h" #include "cockpit.h" +static const Vector3 fog_color{0.64, 0.1, 0.1}; + static Vein *vein; static Ship ship; @@ -35,6 +37,9 @@ if(!vein->init()) { return false; } + vein->set_fog_color(fog_color); + + glClearColor(fog_color.x, fog_color.y, fog_color.z, 1); return true; } diff -r c6a6a64df6de -r aab0d8ea21cd src/main.cc --- a/src/main.cc Sun Apr 22 05:20:03 2012 +0300 +++ b/src/main.cc Sun Apr 22 06:26:08 2012 +0300 @@ -51,7 +51,6 @@ // update any game logic game_update(msec); - glClearColor(0.05, 0.05, 0.05, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // render stuff diff -r c6a6a64df6de -r aab0d8ea21cd src/vein.cc --- a/src/vein.cc Sun Apr 22 05:20:03 2012 +0300 +++ b/src/vein.cc Sun Apr 22 06:26:08 2012 +0300 @@ -11,8 +11,8 @@ Vein::Vein() { - gen_dist = 16.0; - subdiv = 32; + gen_dist = 40.0; + subdiv = 64; ring_subdiv = 24; rad = 2.0; @@ -80,6 +80,15 @@ return true; } +void Vein::set_fog_color(const Vector3 &col) +{ + fog_color = col; + + if(sdr) { + set_uniform_float3(sdr, "fog_col", col.x, col.y, col.z); + } +} + void Vein::draw(const Vector3 &ppos) const { float start_z = ppos.z - gen_dist / 2.0; diff -r c6a6a64df6de -r aab0d8ea21cd src/vein.h --- a/src/vein.h Sun Apr 22 05:20:03 2012 +0300 +++ b/src/vein.h Sun Apr 22 06:26:08 2012 +0300 @@ -14,6 +14,7 @@ int attr_tang_loc; unsigned int tex_norm; + Vector3 fog_color; Vector3 calc_center(const Vector3 &ppos) const; Vector3 calc_dir(const Vector3 &ppos) const; @@ -26,6 +27,8 @@ bool init(); + void set_fog_color(const Vector3 &col); + void draw(const Vector3 &player_pos) const; };