This page was last updated on: August 8, 2020
The vertex shader looks like this:
out vec3 vMCposition; out float vLightIntensity; out float vZ; out vec2 vST; void main( ) { vST = gl_MultiTexCoord0.st; vec3 tnorm = normalize( vec3( gl_NormalMatrix * gl_Normal ) ); vec3 LightPos = vec3( -2., 0., 10. ); vec3 ECposition = vec3( gl_ModelViewMatrix * gl_Vertex ); vZ = ECposition.z; vLightIntensity = dot( normalize(LightPos - ECposition), tnorm ); vLightIntensity = abs( LightIntensity ); vMCposition = gl_Vertex.xyz; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
The fragment shader looks like this:
in vec3 vMCposition; in float vLightIntensity; in float vZ; in vec2 vST; uniform float Ad; uniform float Bd; uniform float NoiseAmp; uniform float NoiseFreq; uniform float Alpha; uniform float Tol; uniform sampler3D Noise3; uniform float ChromaBlue; uniform float ChromaRed; uniform float Blend; const vec3 BEAVER = vec3( 1., .5, 0. ); const vec3 WHITE = vec3( 1., 1., 1.); // return 0. if < left-tol or > right+tol // return 1. if >= left+tol and <= right-tol // else blend float Pulse( float value, float left, float right, float tol ) { float t = ( smoothstep( left-tol, left+tol, value ) - smoothstep( right-tol, right+tol, value ) ); return t; } vec3 ChromaDepth( float t ) { t = clamp( t, 0., 1. ); float r = 1.; float g = 0.0; float b = 1. - 6. * ( t - (5./6.) ); if( t <= (5./6.) ) { r = 6. * ( t - (4./6.) ); g = 0.; b = 1.; } if( t <= (4./6.) ) { r = 0.; g = 1. - 6. * ( t - (3./6.) ); b = 1.; } if( t <= (3./6.) ) { r = 0.; g = 1.; b = 6. * ( t - (2./6.) ); } if( t <= (2./6.) ) { r = 1. - 6. * ( t - (1./6.) ); g = 1.; b = 0.; } if( t <= (1./6.) ) { r = 1.; g = 6. * t; } return vec3( r, g, b ); } void main( ) { vec4 noisevec = texture3D( Noise3, NoiseFreq*vMCposition ); float n = noisevec[0] + noisevec[1] + noisevec[2] + noisevec[3]; // 1. -> 3. n = ( n - 2. ); // -1. -> 1. vec2 st = vST; st.s *= 2.; float Ar = Ad/2.; float Br = Bd/2.; int numinu = int( st.s / Ad ); int numinv = int( st.t / Bd ); vec3 TheColor = WHITE; float alfa = 1.; st.s -= float(numinu) * Ad; st.t -= float(numinv) * Bd; vec3 upvp = vec3( st, 0. ); vec3 cntr = vec3( Ar, Br, 0. ); vec3 delta = upvp - cntr; float oldrad = length( delta ); float newrad = oldrad + NoiseAmp*n; delta = delta * newrad / oldrad; float du = delta.x/Ar; float dv = delta.y/Br; float d = du*du + dv*dv; if( abs( d - 1. ) <= Tol ) { float t = smoothstep( 1.-Tol, 1.+Tol, d ); TheColor = mix( BEAVER, WHITE, t ); //alfa = mix( 1., 0., t ); } if( d <= 1.-Tol ) { TheColor = BEAVER; } if( d >= 1.+Tol ) { alfa = Alpha; if( alfa == 0. ) discard; } float t = (2./3.) * ( vZ - ChromaRed ) / ( ChromaBlue - ChromaRed ); t = clamp( t, 0., 2./3. ); vec3 rgb = ChromaDepth( t ); TheColor = mix( TheColor, rgb, Blend ); gl_FragColor = vec4( vLightIntensity*TheColor, alfa ); }