2017/03/17(金) [n年前の日記]
#1 [dxruby] DXRuby開発版のCustomRenderTarget関係を勉強中
_DXRuby開発版 1.5.21
以降は CustomRenderTarget というクラスが追加されて、ソレを使うとDXRubyでも3D描画その他ができるようになる、ということで書き方を勉強中。と言っても、開発版のzipに同梱されてるサンプルの、3Dtest.rb、spheretest.rb をコピペして弄ってる段階だけど。
ひとまず、こんな感じに。
_crt_test03.rb
しかしコレ、テクスチャの描画はどうやるんだろう。…もしかして 2Dtest.rb を参考にすればいいのだろうか。
意味も分からずにあちこちコピペしてみたら、なんだかソレっぽくなってきた。
_crt_test04.rb
最終的に各ドットの色を決めてくれる、ピクセルシェーダのソースをどう書けばいいのかチンプンカンプンなので、なんだか色がおかしいような気もするのだけど…。とりあえずテクスチャも描画できるのだなと。
OpenGL上では、u,v の v を上下反転しないと正常な描画にならなかったけど。DirectX ではテクスチャ座標の上下の向きが違うから、u,v の v を反転しないまま使えば正常に、と思ったけれど実際試してみたら OpenGL と同様に v を上下反転すると正常描画されるようで。…ホントにそうかな。自分の書いた変換スクリプトがバグってないか。怪しいな。
ひとまず、こんな感じに。
_crt_test03.rb
しかしコレ、テクスチャの描画はどうやるんだろう。…もしかして 2Dtest.rb を参考にすればいいのだろうか。
意味も分からずにあちこちコピペしてみたら、なんだかソレっぽくなってきた。
_crt_test04.rb
最終的に各ドットの色を決めてくれる、ピクセルシェーダのソースをどう書けばいいのかチンプンカンプンなので、なんだか色がおかしいような気もするのだけど…。とりあえずテクスチャも描画できるのだなと。
OpenGL上では、u,v の v を上下反転しないと正常な描画にならなかったけど。DirectX ではテクスチャ座標の上下の向きが違うから、u,v の v を反転しないまま使えば正常に、と思ったけれど実際試してみたら OpenGL と同様に v を上下反転すると正常描画されるようで。…ホントにそうかな。自分の書いた変換スクリプトがバグってないか。怪しいな。
◎ tinywavefrontobj.rbを更新。 :
先日作成した tinywavefrontobj.rb を使って、Wavefront形式(.obj)の3Dモデルデータファイルを、実験用モデルデータへと変換出力しようとしたのだけど。
調べてみたら OpenGL と DirectX は座標系からして違うようで。OpenGLは +z が手前だけど、DirectX は +z が奥らしい。なので、OpenGL用に書いた件のスクリプトは、そのままでは使えなくて。
_OpenGLの座標系
また、現状の CustomRenderTarget、というか VertexBuffer は、頂点インデックス配列を使わないらしい。DXRuby開発版の readme.txt にはそのように書いてある、ように見えた。
ということで、tinywavefrontobj.rb に、いくつかオプションを追加して、DXRubyから使えるデータにも変換できるように修正。
_mieki256/tinywavefrontobj
とりあえずだけど、DXRuby で使えるデータを出力したいなら、--no-index --zflip --color --hexcolor オプションをつければなんとかなる、かなと…。
jsonファイルにしておけば、Rubyスクリプト側では以下のように書いて読み込める。
ところで、色の並びは 0xAARRGGBB でいいのかしらん。DirectX はそのへんどうなってるのかググってもよく分からなかったのだけど、0xRRGGBBAA とか 0xAABBGGRR もあるのだろうか…。
調べてみたら OpenGL と DirectX は座標系からして違うようで。OpenGLは +z が手前だけど、DirectX は +z が奥らしい。なので、OpenGL用に書いた件のスクリプトは、そのままでは使えなくて。
_OpenGLの座標系
また、現状の CustomRenderTarget、というか VertexBuffer は、頂点インデックス配列を使わないらしい。DXRuby開発版の readme.txt にはそのように書いてある、ように見えた。
■4-7. VertexBufferクラス
(中略) このバージョンではIndexBufferは用意されていません。
ということで、tinywavefrontobj.rb に、いくつかオプションを追加して、DXRubyから使えるデータにも変換できるように修正。
_mieki256/tinywavefrontobj
とりあえずだけど、DXRuby で使えるデータを出力したいなら、--no-index --zflip --color --hexcolor オプションをつければなんとかなる、かなと…。
ruby tinywavefrontobj.rb sample.obj --no-index --zflip --color --hexcolor --json > sample.jsonオプションの効果は以下。
- --no-index : 頂点インデックス配列をつけない。
- --zflip : z値を反転。OpenGLとDirectXはz軸の向きが逆、らしいので。
- --color : 頂点カラー配列も出力する。とりあえず、Wavefront形式(.obj)ファイル内の、マテリアル(材質設定)のdiffuse色を、頂点カラーとして代用。
- --hexcolor : 色を 0xAARRGGBB の形で出力。
jsonファイルにしておけば、Rubyスクリプト側では以下のように書いて読み込める。
require 'json' ... vertex_array = nil normal_array = nil uv_array = nil color_array = nil File.open("sample.json") { |file| hash = JSON.load(file) vertex_array = hash["vertex"] # 頂点配列 normal_array = hash["normal"] # 法線配列 uv_array = hash["uv"] # uv配列 color_array = hash["color"] # 頂点カラー配列 }
ところで、色の並びは 0xAARRGGBB でいいのかしらん。DirectX はそのへんどうなってるのかググってもよく分からなかったのだけど、0xRRGGBBAA とか 0xAABBGGRR もあるのだろうか…。
◎ Matrixクラスで少し悩んだり。 :
_RubyのMatrixクラス
の中に look_at() なんてメソッドは見当たらないのに、サンプルは動いているぞ、どういうことだ? などと悩んでしまったりして。
コレ、DXRuby開発版自体に、Matrix という名前のクラスが含まれていたのですな…。考えてみたら、DXRubyのサンプル側では require 'matrix' が書かれていないから、Ruby標準添付ライブラリの Matrix じゃなくて DXRuby が持ってる Matrix が使われるのだな…。
_3度目のVectorとMatrix - mirichiの日記
_[Ruby][DXRuby] DXRuby ユーザのための 標準添付ライブラリの紹介(前編) - あおたくノート
DXRuby側の Matrix はゲーム用に特化したものらしい、とメモ。更に、Ruby標準添付ライブラリには、 _Vectorクラス もあるのですな。これも DXRuby側で独自のクラスを持っている、と…。
しかし、たしかにコレ、ちとハマりそうな気がする…。クラス名をビミョーに変える等は難しいのだろうか…。いや、難しいからこうなってるのだろうけど。
コレ、DXRuby開発版自体に、Matrix という名前のクラスが含まれていたのですな…。考えてみたら、DXRubyのサンプル側では require 'matrix' が書かれていないから、Ruby標準添付ライブラリの Matrix じゃなくて DXRuby が持ってる Matrix が使われるのだな…。
_3度目のVectorとMatrix - mirichiの日記
_[Ruby][DXRuby] DXRuby ユーザのための 標準添付ライブラリの紹介(前編) - あおたくノート
DXRuby側の Matrix はゲーム用に特化したものらしい、とメモ。更に、Ruby標準添付ライブラリには、 _Vectorクラス もあるのですな。これも DXRuby側で独自のクラスを持っている、と…。
しかし、たしかにコレ、ちとハマりそうな気がする…。クラス名をビミョーに変える等は難しいのだろうか…。いや、難しいからこうなってるのだろうけど。
◎ 参考ページ。 :
[ ツッコむ ]
以上です。