#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 resolution;

void circle(vec2 p, vec2 offset, float size, vec3 color, inout vec3 i){
   float l = length(p - offset);
   if(l < size){
       i = color;
   }
}

void rect(vec2 p, vec2 offset, float size, vec3 color, inout vec3 i){
   vec2 q = (p - offset) / size;
   if(abs(q.x) < 1.0 && abs(q.y) < 1.0){
       i = color;
   }
}

float WEIGHT = 3.0 / resolution.x;
float line(vec2 p, vec2 p0, vec2 p1, float w) {
   vec2 d = p1 - p0;
   float t = clamp(dot(d,p-p0) / dot(d,d), 0.0,1.0);
   vec2 proj = p0 + d * t/1.0+(sin(time*0.5)*0.002);
   float dist = length(p - proj);
   dist = 1.0/dist*WEIGHT*(w+(sin(time*0.5)*0.1));
   return min(dist*dist,1.0);
}

void hud(vec2 p, vec2 offset, float size, vec3 color, inout vec3 i, float sp){
   vec2 q = (p - offset) / size;
   if(abs(q.x) < 1.0+abs(sin(time*sp)*19.0) && abs(q.y) < 0.9){
       i = color;
   }
}

mat4 matRotateX(float rad)
{
       return mat4(1,       0,        0,0,
                               0,cos(rad),-sin(rad),0,
                               0,sin(rad), cos(rad),0,
                               0,       0,        0,1);
}

mat4 matRotateY(float rad)
{
       return mat4( cos(rad),0,-sin(rad),0,
                                0,       1,        0,0,
                                sin(rad),0, cos(rad),0,
                                0,       0,        0,1);
}

mat4 matRotateZ(float rad)
{
       return mat4(cos(rad),-sin(rad),0,0,
                               sin(rad), cos(rad),0,0,
                                      0,        0,1,0,
                                          0,        0,0,1);
}

mat4 translate(vec3 t)
{
       return mat4(1,0,0,t.x,
                               0,1,0,t.y,
                               0,0,1,t.z,
                               0,0,0,1);
}

mat4 scale(vec3 s)
{
       return mat4(s.x,  0,  0,0,
                                 0,s.y,  0,0,
                                 0,  0,s.z,0,
                                 0,  0,  0,1);
}

mat4 perspectiveLH(float vw, float vh, float z_near, float z_far)
{
       return mat4(2.0*z_near/vw,                 0,                           0,0,
                                           0, 2.0*z_near/vh,                           0,0,
                                           0,             0,        z_far/(z_far-z_near),1,
                                           0,             0, z_near*z_far/(z_near-z_far),0);
}

mat4 lookAtLH(vec3 aUp, vec3 aFrom, vec3 aAt)
{
       vec3 aX = vec3(0.0);
       vec3 aY = vec3(0.0);

       vec3 aZ = vec3(aAt.x,aAt.y,aAt.z);
       aZ = normalize(aZ-aFrom);

       aX = normalize(cross(aUp,aZ));
       aY = cross(aZ,aX);

       return mat4(          aX.x,           aY.x,           aZ.x,0,
                                         aX.y,           aY.y,           aZ.y,0,
                                         aX.z,           aY.z,           aZ.z,0,
                               -dot(aFrom,aX), -dot(aFrom,aY), -dot(aFrom,aZ),1);
}

vec3 cube(vec2 world, mat4 proj, mat4 view, float time, vec3 p, vec3 s, float rotX, float rotY, float rotZ, vec3 cl)
{
       vec3 col = vec3(0.0);
       vec4 pos = vec4(p,1.0);

       vec4 v1 = proj*view*((vec4(-1.0,-1.0,1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v2 = proj*view*((vec4(1.0,-1.0,1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v3 = proj*view*((vec4(1.0,1.0,1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v4 = proj*view*((vec4(-1.0,1.0,1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v5 = proj*view*((vec4(-1.0,-1.0,-1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v6 = proj*view*((vec4(1.0,-1.0,-1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v7 = proj*view*((vec4(1.0,1.0,-1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v8 = proj*view*((vec4(-1.0,1.0,-1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));

       col += cl*line(world,vec2(v1.x,v1.y),vec2(v2.x,v2.y),0.5);
       col += cl*line(world,vec2(v2.x,v2.y),vec2(v3.x,v3.y),0.5);
       col += cl*line(world,vec2(v3.x,v3.y),vec2(v4.x,v4.y),0.5);
       col += cl*line(world,vec2(v4.x,v4.y),vec2(v1.x,v1.y),0.5);
       col += cl*line(world,vec2(v5.x,v5.y),vec2(v6.x,v6.y),0.5);
       col += cl*line(world,vec2(v6.x,v6.y),vec2(v7.x,v7.y),0.5);
       col += cl*line(world,vec2(v7.x,v7.y),vec2(v8.x,v8.y),0.5);
       col += cl*line(world,vec2(v8.x,v8.y),vec2(v5.x,v5.y),0.5);

       col += cl*line(world,vec2(v8.x,v8.y),vec2(v4.x,v4.y),0.5);
       col += cl*line(world,vec2(v7.x,v7.y),vec2(v3.x,v3.y),0.5);
       col += cl*line(world,vec2(v5.x,v5.y),vec2(v1.x,v1.y),0.5);
       col += cl*line(world,vec2(v6.x,v6.y),vec2(v2.x,v2.y),0.5);

       return col;
}

vec3 airplane(vec2 world, mat4 proj, mat4 view, float time, vec3 p, vec3 s, float rotX, float rotY, float rotZ, vec3 cl)
{
       vec3 col = vec3(0.0);
       vec4 pos = vec4(p,1.0);

       vec4 v1 = proj*view*((vec4(-0.215379,-0.018131,0.254635,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v2 = proj*view*((vec4(-0.130827,-0.030620,-0.229209,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v3 = proj*view*((vec4(-0.605928,0.226597,0.656825,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v4 = proj*view*((vec4(-0.457512,-0.151435,0.173292,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v5 = proj*view*((vec4(-0.301224,-0.276743,0.205711,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v6 = proj*view*((vec4(-0.762492,-0.313925,0.985007,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v7 = proj*view*((vec4(0.219197,-0.018172,0.253044,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v8 = proj*view*((vec4(0.605928,0.226597,0.656825,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v9 = proj*view*((vec4(0.134193,-0.030673,-0.229209,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v10 = proj*view*((vec4(0.457512,-0.151435,0.173292,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v11 = proj*view*((vec4(0.001113,0.122996,0.372016,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v12 = proj*view*((vec4(0.012398,0.313925,0.213513,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v13 = proj*view*((vec4(0.001113,-0.050108,-0.985007,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v14 = proj*view*((vec4(0.301224,-0.276743,0.205711,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v15 = proj*view*((vec4(0.762492,-0.313925,0.985007,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));

       col += cl*line(world,vec2(v2.x,v2.y),vec2(v3.x,v3.y),0.5);
       col += cl*line(world,vec2(v2.x,v2.y),vec2(v12.x,v12.y),0.5);

       col += cl*line(world,vec2(v3.x,v3.y),vec2(v4.x,v4.y),0.5);
       col += cl*line(world,vec2(v4.x,v4.y),vec2(v5.x,v5.y),0.5);
       col += cl*line(world,vec2(v4.x,v4.y),vec2(v6.x,v6.y),0.5);
       col += cl*line(world,vec2(v6.x,v6.y),vec2(v5.x,v5.y),0.5);
       col += cl*line(world,vec2(v5.x,v5.y),vec2(v13.x,v13.y),0.5);

       col += cl*line(world,vec2(v8.x,v8.y),vec2(v9.x,v9.y),0.5);
       col += cl*line(world,vec2(v8.x,v8.y),vec2(v10.x,v10.y),0.5);
       col += cl*line(world,vec2(v10.x,v10.y),vec2(v15.x,v15.y),0.5);
       col += cl*line(world,vec2(v10.x,v10.y),vec2(v14.x,v14.y),0.5);

       col += cl*line(world,vec2(v2.x,v2.y),vec2(v13.x,v13.y),0.5);
       col += cl*line(world,vec2(v4.x,v4.y),vec2(v13.x,v13.y),0.5);
       col += cl*line(world,vec2(v9.x,v9.y),vec2(v13.x,v13.y),0.5);
       col += cl*line(world,vec2(v10.x,v10.y),vec2(v13.x,v13.y),0.5);

       col += cl*line(world,vec2(v3.x,v3.y),vec2(v12.x,v12.y),0.5);
       col += cl*line(world,vec2(v8.x,v8.y),vec2(v12.x,v12.y),0.5);

       col += cl*line(world,vec2(v12.x,v12.y),vec2(v11.x,v11.y),0.5);

       col += cl*line(world,vec2(v11.x,v11.y),vec2(v3.x,v3.y),0.5);
       col += cl*line(world,vec2(v11.x,v11.y),vec2(v8.x,v8.y),0.5);

       col += cl*line(world,vec2(v11.x,v11.y),vec2(v7.x,v7.y),0.5);
       col += cl*line(world,vec2(v11.x,v11.y),vec2(v1.x,v1.y),0.5);

       col += cl*line(world,vec2(v9.x,v9.y),vec2(v12.x,v12.y),0.5);

       col += cl*line(world,vec2(v8.x,v8.y),vec2(v7.x,v7.y),0.5);
       col += cl*line(world,vec2(v3.x,v3.y),vec2(v1.x,v1.y),0.5);

       col += cl*line(world,vec2(v1.x,v1.y),vec2(v6.x,v6.y),0.5);
       col += cl*line(world,vec2(v7.x,v7.y),vec2(v15.x,v15.y),0.5);

       col += cl*line(world,vec2(v12.x,v12.y),vec2(v13.x,v13.y),0.5);
       col += cl*line(world,vec2(v13.x,v13.y),vec2(v14.x,v14.y),0.5);
       col += cl*line(world,vec2(v14.x,v14.y),vec2(v15.x,v15.y),0.5);

       return col;
}

vec3 mountain(vec2 world, mat4 proj, mat4 view, float time, vec3 p, vec3 s, float rotX, float rotY, float rotZ, vec3 cl)
{
       vec3 col = vec3(0.0);
       float pi = 3.14159265358979;

       vec4 pos = vec4(p,1.0);
       vec4 v1 = proj*view*((vec4(1.0,0.0,0.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v2 = proj*view*((vec4(-1.0,0.0,0.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v3 = proj*view*((vec4(0.0,0.0,-2.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));
       vec4 v4 = proj*view*((vec4(0.0,2.0,-1.0,1.0)-pos)*matRotateX(rotX)*matRotateY(rotY)*matRotateZ(rotZ)*scale(s));

       col += cl*line(world,vec2(v1.x,v1.y),vec2(v2.x,v2.y),0.5);
       col += cl*line(world,vec2(v2.x,v2.y),vec2(v3.x,v3.y),0.5);
       col += cl*line(world,vec2(v3.x,v3.y),vec2(v1.x,v1.y),0.5);
       col += cl*line(world,vec2(v1.x,v1.y),vec2(v4.x,v4.y),0.5);
       col += cl*line(world,vec2(v2.x,v2.y),vec2(v4.x,v4.y),0.5);
       col += cl*line(world,vec2(v3.x,v3.y),vec2(v4.x,v4.y),0.5);
       return col;
}

vec3 _vUP = vec3(0, 1, 0);
vec3 _vAT = vec3(0, -2, 0);
vec3 _mEye = vec3(1, 0, 15);
vec3 _mEyeA = vec3(0, 0, 20);

float pi = atan(1.)*4.;
void main( void ) {
       // set up world position
       vec2 worldCenter = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);
       float cLength = length(worldCenter);

       // add post effect
       worldCenter += (worldCenter/cLength)*cos(cLength*12.0-time*4.0)*0.03; // ripple

       vec3 col = vec3(0.0);

       _mEyeA.xz = vec2(-cos(time*0.5)*200.,-sin(time*0.5)*200.);
       _mEyeA.y = 45.0;

       _mEye = _mEye*0.7;
       _mEye.x += _mEyeA.x * 0.5;
       _mEye.y += _mEyeA.y * 0.5;
       _mEye.z += _mEyeA.z * 0.5;

       // pipeline
       mat4 proj = perspectiveLH(1.0, 1.0, 0.12-(_mEyeA.x*0.0003), 1000.0);
       mat4 view = lookAtLH(_vUP, _mEye, _vAT);

       float loopZ = mod(time*3.0, 30.0);
       col += airplane(worldCenter,proj,view,time,vec3(0.0,0.0,loopZ-15.0),vec3(1.8,1.8,1.8),0.0,0.0,sin(time*0.5),vec3(1.0,1.0,1.0));

       col += cube(worldCenter,proj,view,time,vec3(6.0,0.0,0.0),vec3(1.2,1.2,1.2),time*.5-(pi/2.),0.0,0.0,vec3(1.0,1.0,1.0));
       col += cube(worldCenter,proj,view,time,vec3(-4.0,0.0,6.0),vec3(1.2,2.2,1.2),0.0,0.0,0.0,vec3(1.0,1.0,1.0));

       col += mountain(worldCenter,proj,view,time,vec3(4.0,0.0,9.0),vec3(2.2,1.2,1.2),0.0,0.0,0.0,vec3(1.0,1.0,1.0));
       col += mountain(worldCenter,proj,view,time,vec3(-4.0,0.0,-6.5),vec3(2.2,2.1,1.2),0.0,0.0,0.0,vec3(1.0,1.0,1.0));

       // floor
       vec3 gridScale = vec3(3.5,3.5,3.5);
       for(float i = -2.; i <= 2.; i ++)
       {
               vec4 t1 = proj*view*(vec4(-256.0*0.02,-64.0*0.02,i*128.0*0.02,1.0)*scale(gridScale));
               vec4 t2 = proj*view*(vec4(256.0*0.02,-64.0*0.02,i*128.0*0.02,1.0)*scale(gridScale));
               vec4 t3 = proj*view*(vec4(i*128.0*0.02,-64.0*0.02,-256.0*0.02,1.0)*scale(gridScale));
               vec4 t4 = proj*view*(vec4(i*128.0*0.02,-64.0*0.02,256.0*0.02,1.0)*scale(gridScale));

               col += vec3(1.0,1.0,1.0)*line(worldCenter,vec2(t1.x,t1.y),vec2(t2.x,t2.y),0.5);
               col += vec3(1.0,1.0,1.0)*line(worldCenter,vec2(t3.x,t3.y),vec2(t4.x,t4.y),0.5);
       }

       // if you don't want posteffect.
       //worldCenter = (gl_FragCoord.xy * 2.0 - resolution) / min(resolution.x, resolution.y);

       hud(worldCenter,vec2(-1.9+abs(sin(time*1.0)*0.57),0.85),0.03,vec3(1.0,1.0,1.0),col,1.0);
       hud(worldCenter,vec2(-1.9+abs(sin(time*1.1)*0.57),0.75),0.03,vec3(1.0,1.0,1.0),col,1.1);
       hud(worldCenter,vec2(-1.9+abs(sin(time*1.2)*0.57),0.65),0.03,vec3(1.0,1.0,1.0),col,1.2);


       gl_FragColor = vec4(vec3(col), 1.0);
}GLSL Graphics Compo用デモ(行数無制限)

ワイヤーフレーム型シューティングデモです。
弾は出ないです。
何となく、実機が動いてるところと、カメラワーク、なんか、ゲージ的なUIの表示、
あと、ポストエフェクトをかけて、ワイヤーが、ユラユラ波打つように、
揺れるエフェクトをつけてみました。
AtariのBattlezoneや、Rezのような、ワイヤーフレームシューティングとは、
ちょっと、ちがった、ビジュアルアート型、シューティングをイメージ模索し、デモを作成しました。

技術的には、3D表示部分は、レイトレでなく、スクラッチしました。