input update 1
[carveJwlIkooP6JGAAIwe30JlM.git] / shaders / model_character_view.fs
index a85e124d8a862947ce3b26f2da13a7f2551459fc..afeb78d40d9095964ec9848a64064a976dccd1a6 100644 (file)
@@ -1,5 +1,8 @@
 uniform sampler2D uTexMain;
+uniform sampler2D uTexSceneDepth;
 uniform vec3 uCamera;
+uniform vec3 uInverseRatioDepth;
+uniform vec3 uInverseRatioMain;
 
 in vec4 aColour;
 in vec2 aUv;
@@ -10,28 +13,36 @@ in vec3 aWorldCo;
 #include "common_world.glsl"
 #include "motion_vectors_fs.glsl"
 
+float linear_depth( float depth, float near, float far ) 
+{
+   float z = depth * 2.0 - 1.0;
+   return (2.0 * near * far) / (far + near - z * (far - near));        
+}
+
 void main()
 {
    compute_motion_vectors();
 
-   vec3 vfrag = texture( uTexMain, aUv ).rgb;
+   vec3 qnorm     = normalize(floor(aNorm*2.0)*0.5) + vec3(0.001,0.0,0.0);
+   vec3 diffuse   = texture( uTexMain, aUv ).rgb;
+   vec3 composite = world_compute_lighting( diffuse, qnorm, aWorldCo, 1.0 );
 
-   // Lighting
-   vec3 halfview = uCamera - aWorldCo;
-   float fdist = length( halfview );
-   halfview /= fdist;
-   fdist -= 0.08;
+   float dist    = distance( aWorldCo, uCamera ) - 0.08;
+   float opacity = clamp( dist*dist, 0.0, 1.0 );
 
-   vec3 qnorm = normalize(floor(aNorm*2.0)*0.5) + vec3(0.001,0.0,0.0);
+   vec2 back_coord = gl_FragCoord.xy*uInverseRatioMain.xy*uInverseRatioDepth.xy;
+   float back_depth = texture( uTexSceneDepth, back_coord ).r;
+   float front_depth = gl_FragCoord.z/gl_FragCoord.w;
 
-   vec3 total_light = newlight_compute_ambient();
-   vec3 world_light = newlight_compute_world_diffuse( qnorm );
+   back_depth = linear_depth( back_depth, 0.1, 2100.0 );
+   float diff = back_depth - front_depth;
 
-   float world_shadow = newlight_compute_sun_shadow();
-   total_light += world_light * world_shadow;
+   vec2 ssuv = gl_FragCoord.xy;
+   vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) );
+   float dither = fract( vDither.g / 71.0 ) - 0.5;
 
-   vfrag = apply_fog( vfrag * total_light, fdist );
+   if( step(0.0,diff)+dither<0.3 )
+      discard;
 
-   float opacity = clamp( fdist*fdist, 0.0, 1.0 );
-   oColour = vec4(vfrag,opacity);
+   oColour = vec4( composite, opacity );
 }