Tunnel is a cool effect in graphics programming. You can do a tunnel effect using a real geometry (a mesh) or using procedural / ray tracing techniques like in this intro coded by XT95^FRequency (you can see this pixel shader based tunnel in action in ShaderToyMark):
Today, I’m going to show you a simple mesh-based tunnel effect. The GeeXlab demo is based on this WebGL article.
|
The GeeXLab demo is available in the code sample pack in the GLSL_Tunnel/ folder: [download#40#image] This demo requires GeeXLab 0.2.10 or better GeeXLab 0.3.0+* in order to play with GLSL live coding. *: Both GeeXLab 0.3.0 and 0.3.1 have a minor bug: the max width and height are clamped to 1024 pixels. It’s already fixed in the next v0.3.2… |
The principle of this tunnel effect is quite simple: create a mesh cylinder and use a vertex shader to deform and animate the mesh.
1/ Create a mesh cylinder like this one:
2/ Use the following GLSL program to deform and animate the cylinder:
[Vertex_Shader] uniform float time; uniform float tunnel_len; // 80.0 uniform vec2 z_divisor; // 10.0, 10.0 varying float ao; void main() { vec4 pos = gl_Vertex; pos.x += cos(time + (gl_Vertex.z/z_divisor.x)); pos.y += sin(time + (gl_Vertex.z/z_divisor.y)); ao = (((pos.z*2.0) + tunnel_len) * 0.5) / tunnel_len; gl_Position = gl_ModelViewProjectionMatrix * pos; vec4 uv = gl_MultiTexCoord0 * 4.0; uv.y -= time*0.2; uv.x += time*0.1; gl_TexCoord[0] = uv; } [Pixel_Shader] uniform sampler2D tex0; varying float ao; void main (void) { vec2 uv = gl_TexCoord[0].xy; vec3 t = texture2D(tex0,uv).rgb * ao; gl_FragColor = vec4(t, 1.0); }
The z_divisor uniform variable allows to get some cool deformations like this one:
YEEAH! Remember the days, when they used move-lists/tables?
Coming up next: roto-zoom and raster-bars.
It is XT95 from FRequency not TX95 😉
@xoofx: what a shame! Fixed now 😉 Ya que moi pour faire une erreur sur un nick aussi simple!
I think the oldschool way to do this effect is to do it in 2D, like in the shadertoy “Tunnel” example.
More details about this effect in this French forum: http://bbs.demoscene.fr/code/effets-tunnels/