Amazon EC2(linux) で Tower.js

AmazonEC2 上の linux で Tower.js を試してみました。

Node.js を動かすところまでは検索でいろんな情報が見つかるんですが、Tower.jsで検索すると見つからなかったもので記録しておきます。

(別に特殊なことはないんですけどね・・)

  1. Amazon EC2 に登録する
    Amazon EC2を始める(導入編) – .zip -
  2. シェルを起動する

    AWS にログイン


    EC2 Console を開く


    Instances を選択


    インストールしたいインスタンスを選択して Instance Actions から Connect を選択


    今回は用意されているSSHクライアントを使用しました。

  3. MongoDBをインストール
    MongoDBのReplica SetsをUbuntuで試してみる - shinodogg.com -
    (この記事を書いている時点での最新版2.2.0を使いました)
  4. NVMからNode.jsをインストール
    Amazon EC2からnode.jsを使ってみる – .Develop -
    (この記事を書いている時点での最新版0.8.9を使いました)
  5. Tower.jsをインストールしてプロジェクトを作成
    さらばExpressよ!Tower.jsを試すの巻 - コードで一言 -

    僕の場合、プロジェクト作成後の npm tower install の行で下記のエラーが出ました。
    cb() never called!

    npm list を見ると kue というパッケージで unmet dependencies があったので npm install kue して解決。
    無事インストールできました。
    node_modules 内の node_modules へのインストールが危ういっぽい?

  6. 起動!
    $mongod –dbpath /path/to/db/ –logpath /path/to/logfile/ –fork
    $node server.js

ぱちぱちぱちぱち。

ポイントスプライトでテクスチャアニメーション

前回ジオメトリシェーダでポイントスプライトを実装しましたが、

このへんを見ると当然、テクスチャ座標を自分で設定したくなりますよね。

gl_TexCoord[0].st = vec2(0,0);
gl_TexCoord[0].st = vec2(0,1);
gl_TexCoord[0].st = vec2(1,0);
gl_TexCoord[0].st = vec2(1,1);

やることは至って単純で、右辺の0と1にあたる数値をCPUから設定してやるだけです。

0がUV位置、1がUV範囲と思えばわかりやすいかと思います。

両方をuniform変数で渡しても良いのですが、汎用性を考えてUV位置は頂点ごとに設定できるようにしました。

  • バーテックスシェーダ

    前回に加えて、glTexCoord2dでCPUから渡されたテクスチャ座標をジオメトリシェーダに渡してます。

    #version 120
    void main()
    {
     gl_Position = gl_Vertex;
     gl_TexCoord[0] = gl_MultiTexCoord0;
    }
    
  • ジオメトリシェーダ

    前回に加えて、テクスチャ座標の計算が入ってます。

    #version 120
    #extension GL_EXT_geometry_shader4 : enable
    uniform vec2 size; // 描画サイズ(CPUからglUniform2fで渡す)
    uniform vec2 size_uv; // UV範囲(CPUからglUniform2fで渡す)
    void main() {
     gl_Position = gl_ModelViewProjectionMatrix * gl_PositionIn[0];
     gl_Position.x -= size.x/2;
     gl_Position.y += size.y/2;
     gl_TexCoord[0] = gl_TexCoordIn[0][0];
     EmitVertex();
     gl_Position.y -= size.y;
     gl_TexCoord[0].t += size_uv.t;
     EmitVertex();
     gl_Position.x += size.x;
     gl_Position.y += size.y;
     gl_TexCoord[0].s += size_uv.s;
     gl_TexCoord[0].t -= size_uv.t;
     EmitVertex();
     gl_Position.y -= size.y;
     gl_TexCoord[0].t += size_uv.t;
     EmitVertex();
    }
    
  • フラグメントシェーダ

    そのまんまです。

    #version 120
    uniform sampler2D tex0;
    void main (void)
    {
     gl_FragColor = texture2D(tex0, gl_TexCoord[0].st);
    }
    

CPU側では、表示したいテクスチャをglBindTextureしてglUniform1iした上でこんな感じで描画しましょう。

glBegin(GL_POINTS)
glTexCoord2d(s,t);
glVertex3d(x,y,z);
glEnd();

これで、頂点に渡すテクスチャ座標を時間変化させるだけでテクスチャアニメーションができますね。

ジオメトリシェーダでポイントスプライト

OpenGLに、ポイントスプライトという機能があります。

点(Vertex)に対してテクスチャを貼り付けて表示するもので、パーティクルの表示等によく使われるみたいです。

もうちょっと自由度ほしいなーというのと、シェーダのお勉強のために、同等の機能をシェーダを使って実装してみました。

  • バーテックスシェーダ

    CPUから渡された座標をそのままジオメトリシェーダに渡します。

    #version 120
    void main()
    {
     gl_Position = gl_Vertex;
    }
    
  • ジオメトリシェーダ

    四角形ポリゴンを作ってテクスチャ座標を指定します。

    ※GL_GEOMETRY_INPUT_TYPE_EXTにはGL_POINTSを、GL_GEOMETRY_OUTPUT_TYPE_EXTにはGL_TRIANGLE_STRIPを指定しておきます。

    #version 120
    #extension GL_EXT_geometry_shader4 : enable
    uniform vec2 size; // 描画サイズ(CPUからglUniform2fで渡す)
    void main() {
     gl_Position = gl_ModelViewProjectionMatrix * gl_PositionIn[0];
     gl_Position.x -= size.x/2;
     gl_Position.y += size.y/2;
     gl_TexCoord[0].st = vec2(0,0);
     EmitVertex();
     gl_Position.y -= size.y;
     gl_TexCoord[0].st = vec2(0,1);
     EmitVertex();
     gl_Position.x += size.x;
     gl_Position.y += size.y;
     gl_TexCoord[0].st = vec2(1,0);
     EmitVertex();
     gl_Position.y -= size.y;
     gl_TexCoord[0].st = vec2(1,1);
     EmitVertex();
    }
    
  • フラグメントシェーダ

    テクスチャを参照して色を設定します。

    #version 120
    uniform sampler2D tex0;
    void main (void)
    {
     gl_FragColor = texture2D(tex0, gl_TexCoord[0].st);
    }
    

CPU側では、表示したいテクスチャをglBindTextureしてglUniform1iした上でこんな感じで描画しましょう。

glBegin(GL_POINTS)
glVertex3d(x,y,z);
glEnd();