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 と設定)


ライブラリ進捗


ようやくモデル出ました

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

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

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

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

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

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

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


今更ながら


WAクリアした

この間借りたホワイトアルバムをようやく全部クリアした。
浮気ゲーとして名高いアレです。結構辛いとか聞いていたのでワクワクしながら、脇役から片付けていきました。
そして先ほど、全キャラ完了。

もうちょっと辛いかと思っていましたが、イマイチ。ぬるい…。
理奈&由綺のビンタシーンは有名ですが、その部分ももうちょっと濃いとオレ好み。


全文検索


日記の検索がしたくて…。

以前の日記を検索したいことがあって、tDiaryでどうやればいいのか調べてみた。

  1. squeezeプラグインを利用して、動的に作られるページをhtml化しcacheを作成する
  2. その作られたhtmlに対してnamazuを使って検索

という手順になる模様。
とりあえずFC5で動かしているためyumでnamazuとインストールした。

しかし namazu.cgiが見つからない。
どうしてなのか探してみたところ、yum install namazu-cgiでcgiはインストール別だった模様。

設定メモ

インデックス作成時に、サフィックスhtml付けるようにして出力した日記データを対象としたら、検索結果でその日の日記リンクへ飛ばなかった。

理由は、?date=日付.htmlとなっているためで、ここが日付Onlyでないとダメな模様。
よって、squeezeでデータを吐き出すときに.htmlなど付加しない状態にし、インデックスを作成した結果、とりあえずジャンプまで正常動作を確認。

検索結果ページが文字化けする状態が続いていたため、namazurcを書き換えて文字コード設定したところうまく動作するようになった。

Langa ja_JP.SJIS
を記述しました。


Xファイル解析


前回の反省点

前回のフォント問題は解決できたので、今回はDirectXのモデルファイルについて色々と。

ちなみにフォントの問題で一番引っかかったのが、
SHIFTJIS文字列→UNICODE変換時で変換できなかった文字について、
UNICODEでの”・”に変換されたため、除去に失敗してた…。

モデルフォーマット

今作っているライブラリ専用モデルファイルを作成しようと色々考え中。

DirectXのXファイルを読み込んで、自分の形式にするコンバータ作らないとなぁと思って、まずはそれを準備してみようと思って作業中。よってスキニングの仕組みを改めて調査&勉強してみたり。

スキニングモデルと単なるポリゴンメッシュのモデル、そしてアニメーション付き、
これらをちゃんと読み込んで変換するのはちょっと苦労しそうだ…。

アニメのことを考えると D3DXLoadMeshFromXは使えない。
D3DXLoadSkinMeshFromXofを使用するのか?と思いきや、LPDIRECTXFILEDATAは廃止に向かってるようだし、関数名変わってるし。

素直にアニメーションスキニングメッシュ読み込むサンプルをそのまま実装して、必要なデータだけ抽出するようにするか…。


インスタンシング


今日もインスタンシング

昨日に引き続き、今日はShaderInstancingをトライしていた。しかしHWインスタンシングに比べて動作は理解しやすい。単に形状データを繰り返し、頂点バッファを満たしておけばいい。あとはそれに対する変形パラメータを外部から叩き込めば終わり。必要回数、必要ポリゴン数になるまでdrawPrimitiveを繰り返す。

そんなわけで、さっくり実装できた。

HLSL

今は起動時で読み込んでコンパイルさせているけど、デフォルトのシェーダーくらいはlibに組み込んでしまいたいと思って色々調べてみた。どうやらバイナリのリソースとしてリソーススクリプトで記述すれば良さそうです。

GUIの操作としては、リソースのウィンドウで追加→ファイルから〜
その時の.rcの中身にはこんな風にして追記されることになります。

(グループ名を入れたかったのでそこだけは手作業)

<名前> <グループ名> DISCARDABLE “ファイル名.fx”

ここまでやって気付いたのだが、そのままバイナリファイルに組み込まれるみたい…。

さらに調べてみると .fxから .fxoを作ってしまうという方法もあるようだ。コンパイル済みシェーダーといったところか。

こちらを組み込みにすれば、先ほどよりはマシだろう。読まれたくないならば、
fxoをさらに暗号化してリソースにインポートすればいい話だし。

これには、プロジェクトに追加されている.fxファイルにコンパイルの記述を追加する。

こんな感じでコマンドライン行に追加。最初のはバージョンを決めるためのものだろう。
さらに、出力ファイルの箇所で “bin/$(InputName).fxo” と記述するのも忘れずに。

デバッグ版とリリース版で同じでも問題ないと思うけど、オプションを変更することも可能です。


あけましておめでとうございます。


あけおめ

新年あけましておめでとうございます。

今年は初日から日記記述です。がんばります。

foltia

アニメ専用録画システムのfoltiaをインストール&設定していました。

通常設定だとPSP/iPod用のトランスコンバートの処理が録画後に走るのですが、
オレはCMなどをカットして保存するクチなので、ちょこっとスクリプトに手を入れて環境を作っていました。

アニメはfoltia、TVドラマはmythtvと分けて使っていく方針です。

なお、この正月期間中にどうでもいいアニメの予約を入れてみて、実験予定