OpenGL対応その2

DXRuby Advent Calendar 2013、26日目です。嘘です。25日目はDXRubyの開発環境に(将来的に)望む物でした。

配布形式については初めの頃からの課題ではあって、どうにかできないかとRBatに暗号化を突っ込んでみたりしているのだが、そのやり方はrequireの動作をユーザが実装できないというRubyの仕様(実装?)の壁にぶちあたって頓挫中である。本命はRuby本体のコンパイル済みバイナリ読み込み機能実装だが、いつ実装されるかもわからない(とりあえず最短1年後〜最長無限)ので、何かしら手を考えてみたいところ。とりあえずRuby本体に手を加えるなら簡単だろう。しかしできれば避けたい。
リソースの暗号化はzlibでも使って圧縮して独自フォーマットに入れておけば簡単には見れなくなるが、ソース公開ならそれほど苦労なく見れることになる。すべてはソース非公開の手法がどうにかなればという話である。

さて、この前のOpenGL対応テストの後、人に頼ってばかりじゃなくて自分でなんとかせねば、ということで、少しOpenGLをいじって挙動を確認、普通に使えるようにDXRubyテスト版を修正してみた。dxruby158dev-test-mswin32-ruby20.zipおよび、dxruby158dev-test-mswin32-ruby19.zipである。Image#to_sでのテクスチャのフォーマットの修正、Image#connect_gl時にα無しフォーマットのテクスチャに差し替えすることでOpenGLで描画がまともにできるようになった。
バインダは使えるものを好きに使ってくれていいと思うが、ruby-openglはそのまままともに動くかというとなんか怪しい(動かしたことは無い)し、opengl-bindingsはOpenGLのCインターフェイスをそのままFiddleでアクセスするものなのでテクスチャ設定とかfvやdvの関数呼び出し時のpackとかの手間がある。使えるのはそのあたりを自力でどうにかできる人に限られると思うが、できる人は試してみて欲しい。開発版の次をリリースするときには2.0用にopengl-bindingsを使うサンプルを入れておこうと思う。たぶん頂点バッファとかシェーダも使えるんじゃないかと思うが俺はそこまでするモチベーションは無いので、試してみる人は動かしてみて動かんかったらソース付きで「動くはずである」とでも書いて連絡してくれれば悩んでみよう。
どこまで動くのかはわからないが試した限りではDirectX9の固定機能レベルのことはできていたので、速度を要求されないタイプのゲームの描画を3Dにすることはできるのではないかと思う。

そういえば何故DXRubyでOpenGLなのか、というのはみんな疑問に思ってるかもしれないのでちょっと書いておくと。
DirectXインターフェイスはそのままRubyに出すのが難しく、OpenGLはただの関数呼び出しなので出しやすい、というのがまず最初にある。つまり、DirectXの3D機能をRuby用に提供するなら何かしらのラッピングをしないといけなくて、それは呼び出し規約とかのレベルではなく、クラス設計的なレベルの話になり、原始的な機能を作って提供するのか、高位の機能を作り込むのか、という部分で非常に悩ましい。世の中の変化は速くて、3Dを扱う上での一般的な作り方というのもどんどん変わる。3Dの扱いがよくわかってない人間が中途半端に作るのは危険がいっぱいなのである。DXRuby1.1の3D機能がどんなものであったかを覚えてる人はなんとなく理解できるんじゃないかと思う。
対してOpenGLはシンプルな関数呼び出しのみをサポートする。それはopengl-bindingsのようにRubyからFiddleでアクセスできるレベルのものだ。GPUを使って描画するというレベルに特化していて、データ構造をどうするか、制御をどうするかはすべてユーザに任されている。OpenGLを使うならRubyで書く人だろうがCで書く人だろうが、上位のラッパを自分で書かないとどうにもならんわけだ。たぶんそういうものだからRubyOpenGLと言ったときにまともに動くものがほとんど作られていないのである。
まあ、そういう状況なので、とりあえずOpenGLと接続しておけば使えるんじゃないかなーとか(意味がわからない

シンプルなインターフェイスを持つOpenGLと接続さえすればそれが使えるのならば、そのレベルの3Dでもやりたい人には手っ取り早くそっちでやってもらって、DirectXをラッピングした高度な3D機能はゆっくり考えよう、という話である。
どのように作れば簡単で、かつ、必要十分な基本機能が揃って、やりたいことが実現できる速度が出るのか。それはたぶん、3D素人がちょっと考えて作れるようなレベルではない。ぼんやりとイメージはあるが、もうちょい時間が必要かなと思う。