「 2007年04月 」一覧

PC新調しました


新しいマシンを組みました

価格改定を待てず、Core2Duoのマシンを組み立てました。
どこへ行ってもE6400が無かったため、E6300で組み立て。

元々、新PCは二の次で、やりたかったことのメインは、
『GeForce8600GTを買うこと!そして、VistaでDirectX10!』
が本当の目的です。

新PCを組むなら P965のチップセットで〜も条件だったため、適当にパーツ選んできました。

CPU Core2Duo E6300
メモリ 2GB (DDR2 800)
M/B Gigabyte 965P-DS3P
VGA Albatron 8600GT (256MB)

こんな感じです。
これからVistaなど色々と入れてゴールデンウィークにはD3D10いじってみようと計画中です。


メモリリーク追跡


DirectXのメモリリーク

DirectXを使ったプログラムを作っていて、VRAMに確保したデータを解放せずに終了させてしまうこと、よくあることです。
特に適当に作ったプログラムや、実験を重ねて複雑になってしまったものによくあります。

そういうとき、DirectXのデバッグランタイムを使用しているのであれば、
以下のようなメッセージがプログラム終了時に表示されます

こういうときに、実はデバッグランタイムを使用していればどこのタイミングで確保したモノなのかがチェックできるらしいです。

上記の、AllocIDの部分でデバッガのブレークを貼ることが出来ますが、
手元でチェックしてみたところ、一つの目安にしかならない感じがします。

定番なのかもしれませんが、このIDの数が大きい方から処理していった方が良さそうです。
たとえば、上記AllocID=1ですと、CreateDeviceでデバイス作成したところで引っかかります。

考察としては、COMが参照カウンタ方式なため、参照された瞬間にカウンタがインクリメントされ、のちのちまで残ってしまったために、上記で表示されているのだと考えられます。

よって、数が大きいモノ、最後に参照カウンタをいじって生き残っているモノからデバッグ(解放処理?)を入れていくのは正しいのではないかと思います。


SkinnedMesh


スキンメッシュの表示

前回からチャレンジしていて、助言を元に色々と試行錯誤してました。

で、最終的にはコンバータから出力した頂点データが 固定機能のインデックス付き頂点データで、
表示させようとしている側は、シェーダーによる表示方法を選択。という不一致が原因だった模様。

コンバータから出力するデータも若干おかしいと思える箇所を SkinnedMeshサンプルを参考にして修正。
表示側も固定機能による表示方法(D3DINDEXED)を適用することでやっと表示できました。

次はシェーダーによる表示方法にチャレンジしたいと思います。ConvertToIndexedBlendedMeshによる変換作業が具体的に何をやっているかが謎ですね。固定機能にしろシェーダーにしろ特に中身のデータが変わるとは思えないのですが。

追加

シェーダー定数の個数制限のためにパレット制限がかかるということに気付きました。

基本的に26個のマトリックスしかシェーダーに転送できず、
そのためにConvertToIndexedBlendedMeshはデータを変換して、
ボーンコンビネーションを複数回に分割するということをしている模様。

tiny.xの例で言えば、固定機能時はパレット36個は1回のdrawコールでOKだったものが、シェーダーを使うと2回の描画に分かれる。コンビネーション数が2回になってました。

この分け方のアルゴリズムとかは興味ありつつも、調査はしないことにします。
とりあえずもっと先へ進みたいので。

その前にコンバーターのソースを整形しないと不味そうですが…。リークもあるし。


Windowsキーの復活


英語キーボードでもWinキー使いたい!

家でも会社でも、英語キーボードの101配列なのですが、
Vistaとか使い始めると、フリップ3Dとか目玉機能があるのに使えないという状況に。

そして、噂で聞いていたWindowsキーを別のキーに代替させるという方法をとってみることにしました。

参照先 :http://journal.mycom.co.jp/column/winxp/181/index.html

手順は以下の通り

  1. regeditを起動
  2. HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Keyboard Layout を開く
  3. この場所に新規のキーを追加して、キーの代替を設定します。
  4. キー名は”Scancode Map”, キータイプは”バイナリ値”.

うちでは、以下のようにキーの中身を設定しました。

代表的なスキャンコードを以下に記述しておきます。

キー名
Alt(右) 0xE038
Alt(左) 0x38
Caps Lock 0x3A
Ctrl(右) 0xE01D
Ctrl(左) 0x1D
Esc 0x01
F11〜F12 0x57〜0x58
F1〜F10 0x3B〜0x44
Num Lock 0x45
Scroll Lock 0x46
Windows(右) 0xE05C
Windows(左) 0xE05B
ひらがな 0x70
スペース 0x39
半角/全角 0x29
変換 0x79
無変換 0x7B

設定時のポイントは、レジストリに設定するときに2バイトのコードは逆転して記述すること。

(0xE038 → 38 E0 と設定)


ライブラリ進捗


ようやくモデル出ました

ようやく独自モデルファイルを読み込んで、表示することが出来ました。

現在では単なるポリゴンメッシュのみで、スキニング適用したものや親子構造を持っているモノについては正常に表示されません。

次のステップとしては親子構造、そしてスキニングメッシュを表示ですかね。

さらにその後、テクスチャを貼るところまでやらないとモデル読み込み完成とは言えないですね。

さらにこのモデルライブラリで試験的に表示できるクラス含めていますが、

表示オブジェクト事にバッファ作っちゃうので、使用には耐えません。
実際に使うときには一つのバッファを共用するようにしなくては。

もっともそれはさらに上位ライブラリがやるべきことなんですがね。