XBOX360のゲームパッド


入力管理モジュール

Vista x64環境であっても XBOX360のゲームパッド非公式ドライバが存在していたので早速導入。 しかし、x64なので非公式ドライバは署名がない…。そのため起動時には、F8を押して、「ドライバ署名の強制を無効にする」を選択しなくてはならない。とりあえずそれで動作をチェックしてみたところ、やはりちゃんと動きました。

Vistaでの公式ドライバ名

XBOX 360 For Windows(Controller)

Vistaでの非公式ドライバ名

Microsoft Xbox360 Controller

だそうです。これの違いを見て自前で処理を振り分けとかしないとダメかも知れませんね。

 


smbclient


WindowsPCのほうにデータをコピー(バックアップ)したくて、久々にLinuxからWindowsの共有をマウントする、ということをしてみました。

そこで驚いたのが、いつの間にかコマンドやオプションが無くなっていること。
mount -t smbfsではそんなタイプ知らないといわれるし、 smbmountコマンドやろうとしたらそれも無いと言われる。

一方、smbclientは入っていたりするので謎でした。
結果は最近のものは、mount -t cifsとしてマウントさせるとのこと。
さらにこの状態では日本語フォルダをコピーしたり出来ないので、適切にオプションを設定してやることが必要

 

これで何とか出来るようになりました。ちなみにWindowsはVista, LinuxはEUCで保存するようにしているのでこんな感じに。


スプライン実装してた


週末はずっと3次スプライン関数を実装してました。
とりあえず非周期版と周期版の2種類を用意。参考文献は、C言語によるアルゴリズム事典より。
実際に使う場面はまだ先になりそうだけど、出てきた値をグラフ化してみるといい感じの曲線を描いてくれてちょっと幸せ。

HDDレコーダ応答不能

番組表表示させようとしたらリモコンが聞かなくなった。
そして、電源オフだけは効いたのですが、PLEASE WAIT …. の状態のままずっと・・・。また何か毒電波出したのだろうか。

 


スキニング問題


前からやっていたスキニング、前回までの結果ではうまくできないことが判明し、もがいてます。

出来ないのは下記の理由により。

  •  SkinedMeshサンプルではマトリックスパレットに設定している値そのものがワールドになっている。
  •  結果、ライト位置をモデル空間に変換しただけではNG (全てをワールドでやればOKでしょうが…)

というわけで、スキンメッシュの表示方法そのものを変更しようかと。
点光源にチャレンジしていなかったら、上記の問題点に気付かずに放置していただろうなーと思うと運が良かったのかな。

 


描画システムのMultiThread対応


スキニングメッシュもかろうじて表示できたので、諸々の部分をダブルバッファリングにして、描画とメインの実行ループの分離を行ってみました。文章にするとこれだけのことなのに苦戦しましたよ…。

  • DirectXのリソース作成・破棄はメインスレッドでやらなくてはいけない
  • アプリケーションの実行はサブスレッドになる。
  • DirectXは、WndProcが実行されるスレッドで初期化されなくてはならない。また基本的にこのスレッドで実行されるべきである。
  • 当然、描画要求を出してタイミングがきたら描画。このためバッファリング必要

色々と書き換えてようやく、ポイントライトなシェーダーを実行させるところまでは出来ました。しかしスキキングメッシュ関連で、マルチスレッド化に伴いフォルスシェアリングが起こりそうだったので、またスキニングメッシュは表示できない状態へ戻りました…


DirectXのロックの謎


DirectX9のLockについて、調べてみたことをメモしておきます。

Textureのロックには、範囲指定があるが、Lockは複数回できるのか?

まずは推測から。
範囲指定がわざわざあるということは、部分1でLockし、部分2でLockしても問題なさそうである。また、領域が重なった場合は多重ロックになりNGとなる。と予想。

結果は・・・領域が被っていようが、別部分であろうがNGでした。どうやら、範囲指定はパフォーマンスをあげるためのダーティー判断くらいでしかなさそう。ただし、異なるミップマップについては同時Lockは可能のようです。

 

VertexBufferのロックはどうだろうか?

テクスチャが上記のような結果になったのだから、やはり多重ロックは失敗するだろうと予想。あるいはNO_OVERWRITEフラグなんかあるし、領域さえ違えば成功するのかも知れない。

結果は・・・領域が被っていようが、別であろうが、多重ロックは成功する。多重ロック後は、正しくUnlock呼ばないといけないそうです。

このロックの挙動の違いは問題になりそう…。そもそも多重ロックを許可しない方針でプログラムを作っていくべきかも知れません。

上記を試したのは、DirectX9.0cで、GeForce7600GT on Vista(x64)です。他のメーカーのカードでは異なる結果となるかも知れません。 次は、OpenGLのMapBufferとか調べてみる?!

 


インテル スレッディングビルディングブロック


最近の自分のぐっと来るポイントに、templateとスレッドがあったわけですが、これらをミックスした書籍があるとのことで探し回ってました。

2月末に出ていたらしく、その本のタイトルは、”インテル スレッディングビルディングブロック” TBBと略されるらしいです。オープンソース版と商用版が提供されてます。

ざっと読んでみたところ、ループをスレッドを使うように展開したparalell_for関係の使い方と、作業をパイプライン化、もしくは単純にタスク化しての使い方の説明で終わったと思います。
他にも、単純にSTLコンテナをスレッドセーフにするためにロックさせるものよりも効率の良いコンテナ群の説明とか。

感想としては、もうちょっと内部的な話を見たかったのですが。それはOSSで提供されているコードを見ろってことでしょうか。しかし、2コアのシステムでこれを有意義に使える状況って限られるんじゃないですかねぇ…

少なくともゲームにはこのままじゃ使えなさそうです。

 


XSI ModToolからスキニングメッシュ出力


スキニングメッシュとして、円柱にボーンを仕込んだものを作ってみました。

適当に曲げてみて、それを独自形式変換して表示できるかやってみたのですが、失敗してしまい、 tiny.xからの作った場合には正常に表示できているのですが。

うまく出す方法判明

いくつか試してようやく解法がわかりました。
DirectXのエクスポーターの設定で CompressMeshにチェックが入っているとダメのようです。

また、Trianglateにチェックを入れても豪快に崩れました。
このことから、素直に .xを作り、やるならその後最適化をするという流れをとった方が良さそうです。

 


スキニングメッシュ


ようやくtiny.xを自前フォーマットに変換して描画まで確認。
苦労したけど、サンプルのSkinnedMeshのデータと比較できたのでまだ楽だった。

スキニングの一番の問題点は、行列のデータを見ても全く正しいことがわからないこと。オフセット行列も正しいか謎だし。簡単なサンプル作るにしても、スキニングメッシュを作るには、一般的にはモデラーが必要になるし。

今回の一番のポイントは、DrawSubsetらから抜け出せたこと。

drawSubsetの中身は結局は描画バッチを実行しているだけに過ぎない。
内部では、DrawPrimitive呼び出しを実行しているだけだろうし、その部分を自分で何とかやろうとしてみた。

ConvertToIndexedBlendedMesh を実行すると、属性グループ、ボーンコンビネーションバッファが取得できるのでこれから何とでもなる。

pBoneComb[ AttibId ]で、1回のDrawPrimitive呼び出しに必要な頂点数、インデックスなどは入っているし、

必要とするボーン(フレーム)へのIDも取得できる

pBoneComb[ AttribId ].BoneId[ n ]

ここで、必要とするボーン数はパレットの数としてメッシュコンテナが取得しているので、そのループで回せば必要とするボーンIdが取れる。

このボーンIdから、さらにGetBoneName( BoneId )すれば対象とするフレームの名前が取れる。

注意点としては、パレット数(nNumPaletteEntries)はシェーダーのマトリックスパレット数で制限される。で、複数回に分けられた後、最後の描画グループでは、パレットが全て埋まるわけではない。

tinyでやったところ、13という中途半端なものになった。
このとき、BoneIdが UINT_MAXになるのでその場合は取得しないなどの条件が必要となる。

この辺はSkinnedMeshのサンプルで実装されていて、あぁ、なるほどと思ったポイント。


(no title)


_ ! [プログラミング] リフレクションlib

どうやらさらにバグがある模様。ツリー構造のモデルでたまにデシリアライズに失敗…

_ ! [プログラミング] 描画

ツリーの問題が解決しないけど、単に表示部分をテストしてみた。

_ 色々と苦労したけど、ワイヤー上でVB/IBの状態確認…