Feb 15, 2008

GL Excess/Ruby : Scene 6 の移植中


Scene 6 です。GL Excess で唯一、何らかのツールでモデリングされたジオメトリ(ロケットです)が登場します。 とりあえず、ロケット以外のもの全部を移植してしまいました。

ロケットの準備ができるまでの間、かわりに Teapot に飛んでもらうことにしました(^^;
オリジナル版ではモデルデータ(頂点情報とインデックス)を C の配列でベタ持ちしています。 Ruby ではこれをどのような形式で持つのがいいか、考え中です。
(案)
  • Marshal.dump で前処理しておいたバイト列を Marshal.load で復活
  • Array#pack/String#unpack

Feb 11, 2008

GL Excess / Ruby : Scene 5 を移植


バンプマッピングが印象的な Scene 5 です。最近主流のピクセル単位の処理で はないことから、負荷はそれほどでもありません。バンプマップの処理よりも、 燈台の炎を表現するパーティクルが負担になっている印象を受けます。

GL Excess / Ruby のページも更新。 Scene 5 をダウンロードできるようにしておきました:
未実装のシーンは 6, 7, 8, 10, 11 の 5 個です。

Feb 6, 2008

GL Excess / Ruby : Scene 1 を移植


GL Excess のオープニングである Scene 1 を移植しました。全然問題なしです。

GL Excess / Ruby のページも更新。 Scene 1 をダウンロードできるようにしておきました:
残りは 6 シーンになりました。未実装のシーンは 5, 6, 7, 8, 10, 11。大物ばかりですね。

Feb 4, 2008

GL Excess / Ruby : Scene 12 をサクッと移植、と思いきや


Scene 12 は GL Excess 全12シーンで一番短い行数のプログラムです(scene12.cppが281行)。

移植なんて一瞬だぜ、と思っていたら。
texture.rb で raw テクスチャの幅が正しく取れないケースがあることがわかりました。 Ruby 1.8 と 1.9 との間で、 String#to_i の挙動に違いがあることが原因のようです。
両方のバージョンで動かしたかったがために、次のようにして対処してみました:
texture.rb
major, minor, micro = RUBY_VERSION.scan( /\d+/ )

if ( major == "1" && minor == "8" )
  # for Ruby 1.8.
  width  = pow2( w[0].to_i - "0"[0].to_i )
  height = pow2( h[0].to_i - "0"[0].to_i )
else
  # for Ruby 1.9.
  width  = pow2( w[0].unpack("U")[0].to_i - "0"[0].unpack("U")[0].to_i )
  height = pow2( h[0].unpack("U")[0].to_i - "0"[0].unpack("U")[0].to_i )
end
普通であればどのようにして対処するべきところなのでしょうか?
GL Excess / Ruby のページも更新。 Scene 12 をダウンロードできるようにしておきました:

Feb 3, 2008

GL Excess / Ruby : Scene 4 を移植


パーティクルが多いように見えるので心配でしたが、特に問題なく移植できました。

GL Excess / Ruby のページも更新。 Scene 4 をダウンロードできるようにしておきました:

Feb 2, 2008

GL Excess / Ruby : Scene 3 を移植


シーン冒頭の山がせり上がってる部分については、ディスプレイリスト + glScalef() の組み合わせで書き直しました。計算の無駄を省いたおかげで、元となっている glxsglut に比べても遜色ない速度で動いてくれるようになりました。

そのようなわけで GL Excess / Ruby のページも更新。
移植済みのシーンは 2, 3, 9 。残りはあと 9 個です。

Jan 27, 2008

GL Excess / Ruby : Scene 2 を移植してみましたが…


オリジナルと同じ挙動が再現できていますが…遅い orz

200粒のパーティクルもキツそうですが、水面の波紋を表現するために 64x64個 の位置と法線を毎フレーム更新しているところが Ruby にはつらすぎます。
今なら頂点属性の時間発展はバーテックスシェーダにまかせてしまうところな のですが、オリジナルは 2001 年の作品。
負荷の大きい部分はわかりきっているので、そこだけを C の拡張モジュール化 してしまえば、処理速度は改善されるはずです。しかしそれで GL Excess / Ruby を名乗ってよいものなのでしょうか。悩み中です。