X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=shaders%2Fscene_override.fs;fp=shaders%2Fscene_override.fs;h=45ac33ef13a29027c172d7f0ec708d2b2e1d76be;hb=bf9f3897d358cb6c417e28d659bb412344a52bc3;hp=a1826542209b25b5cc6c3e7030e6b0af90e67c0c;hpb=f2c3e6ffba0231be14961f0149106cecbade8124;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/shaders/scene_override.fs b/shaders/scene_override.fs index a182654..45ac33e 100644 --- a/shaders/scene_override.fs +++ b/shaders/scene_override.fs @@ -3,14 +3,14 @@ uniform sampler2D uTexMain; uniform vec3 uCamera; uniform vec4 uPlane; -uniform vec4 uPlayerPos; -uniform vec4 uSpawnPos; +uniform vec4 uPlayerPos; /* w: distance to uSpawnPos */ +uniform vec4 uSpawnPos; /* w: inverse distance to uPlayerPos */ +uniform bool uAlphatest; #include "common_scene.glsl" #include "motion_vectors_fs.glsl" -vec2 smin( float a, float b, float k ) -{ +vec2 smin( float a, float b, float k ){ float h = max( k-abs(a-b), 0.0 )/k; float m = h*h*0.5; float s = m*k*(1.0/2.0); @@ -21,8 +21,7 @@ vec2 smin( float a, float b, float k ) return vec2(b-s,1.0-m); } -void main() -{ +void main(){ vec2 ssuv = gl_FragCoord.xy; vec3 vDither = vec3( dot( vec2( 171.0, 231.0 ), ssuv) ); float dither = fract( vDither.g / 71.0 ) - 0.5; @@ -35,33 +34,35 @@ void main() vec3 vfrag = vec3(0.5,0.5,0.5); vec3 qnorm = aNorm.xyz; - if( !gl_FrontFacing ){ - qnorm *= -1.0; + if( uAlphatest ){ + vec4 vSample = texture( uTexMain, aUv ); + if( vSample.a < 0.5 ) + discard; + } + else{ + if( !gl_FrontFacing ){ + qnorm *= -1.0; + } } vfrag = scene_compute_lighting( vfrag, qnorm, aWorldCo ); - + + // dots float d0 = distance( aWorldCo, uPlayerPos.xyz )*2.0; float d1 = distance( aWorldCo, uSpawnPos.xyz ); vec2 dm = smin( d0, d1, 10.0 ); - float dd = fract(dm.x*0.2-g_realtime*0.5)*max(0.0,1.0-dm.x*0.04)*max(0.0,qnorm.y); - + float dd = fract(dm.x*0.2-g_realtime*0.5) * + max(0.0,1.0-dm.x*0.04) * + max(0.0,qnorm.y); vec3 emit = mix(vec3(1.0,0.0,0.0),vec3(0.0,1.0,0.0),dm.y)*dd; - - - - vec3 v0 = normalize(uSpawnPos.xyz-uPlayerPos.xyz); - float t = min(max(dot(aWorldCo-uPlayerPos.xyz,v0),0.0), - distance(uSpawnPos.xyz,uPlayerPos.xyz)); - + // line + vec3 v0 = (uSpawnPos.xyz-uPlayerPos.xyz)*uSpawnPos.w; + float t = clamp( dot(aWorldCo-uPlayerPos.xyz,v0), 0.0, uPlayerPos.w ); vec3 p0 = uPlayerPos.xyz + v0*t; float d3 = distance(p0,aWorldCo); - - float lp = fract(t*0.2-g_realtime+d3*0.2)*max(0.0,1.0-d3*0.2); - - emit += vec3(lp); + emit += vec3(fract(t*0.2-g_realtime+d3*0.2)*max(0.0,1.0-d3*0.2)); oColour = vec4( vfrag+emit, 1.0 ); }