正射影。簡単にいうと、画面の奥行きの概念をなくした射影変換である。

この射影変換をすれば、普段の3Dの画面が2Dになる。そして奥行き、つまり遠近感がなくなる。



その事に関して長い間引っかかったことがあったので・・・メモる。

DirectXでは、D3DXMatrixOrthoLH()という関数を使えば、簡単に正射影変換ができる。

で、その関数の引数に、幅、高さ、ニアプレーン、ファープレーンを設定するわけなんだが・・・。

それで普通にゲームを作っていたら、何かがおかしい。
具体的に言うと、当たり判定がバグった。

画面の右下に行けば行くほど、当たり判定がずれていくのだ。

「なんじゃこりゃ?」と、悩むこと1週間。
原因はこの正射影だった。

幅と高さに、ウィンドウの幅、高さを渡していたのだ。それが間違い。

ウィンドウには、外枠が存在する。ウィンドウの名前とか、終了ボタンとかがある場所がそれだ。
ウィンドウの幅、高さというのは、その外枠を含めてのサイズになる。


つまり、実際の画面のサイズ(クライアント領域という)とウィンドウのサイズは微妙に違うのだ。


それ故に、当たり判定がずれた。
正確には、自分の思っていた位置とは少しずれた位置に描画されていたのだ。


正射影をするときには、クライアント領域の幅、高さを渡してやらないといけない。
同じ現象にもしも悩まされている人は、ぜひとも試していてほしい。
DirectXについて掘り下げて学んでいると、なんだか今後重要そうなのが出てきたので、
メモっておく。前記事で言ったマルチスレッド関連はいつになるかわからない。

D3DDEVTYPEには2つある。D3DDEVTYPE_HAL,D3DDEVTYPE_REFだ。
HALだって!?なんて一瞬思ったが、全くの無関係である。


これはIDirect3D9::CreateDevice()の第2引数に渡す定数なんだけど、
この2つを切り替えるだけで、バカ見たく処理速度が変わる。

結論、速いのがHALで糞遅いのがREF。
どうやら、描画関係の処理全て(頂点処理除く)をGPU(ハードウェア)でやるかD3D(ソフトウェア)でやるかを切り替えるものみたい。

当然GPUの方が速い。ならば迷うことなくHALを使うべきである。
しかし、REFを使わなければならないタイミングは存在する。じゃなきゃこんな設定は存在しない。

それが大事かなと思ってメモしている。しばらくHALのままで行きそうだから。

REFは、いわゆるデバッグに使うことができる。
HALだといろんな情報をGPUに渡して計算してもらうので、GPUの中でどのように値が変化していっているか、見ることはできない。これは絶対にできない。
(できたらGPU作ってる会社のノウハウがダダ漏れになるってことだからかな?)

REFにしとけば、D3Dの方ですべての計算を行うので、どのように値が変化していっているかを追う事ができる。
つまり、デバッグができるということなのだ。

その分処理は遅くなってゲームどころではなくなるが、これは大事な機能だ。


覚えておくと、便利かもね。
終わり。


衝撃の事実が発覚したので、記録として残しておく。

初のゲームプログラム関連の記事がこんなものになろうとは・・・


現在、DirectXというSDKを使ってゲーム開発をしている。バージョンは9.0。

で、最近マルチスレッドを学んだ。
なんと便利!そう思っていた。

しかしマルチスレッドというのは如何せん理解しづらく、「並列で処理が走る」が故の
同期処理を習得するのに時間を要した。

同期処理を一つミスれば、プログラムが止まってしまう可能性があるからだ。

なんという厳しい世界。とかなんとか思っていた。
そして少しはできるようになったんだ。


そして、DirectX9を使ったプログラムに、マルチスレッドを使ったのだ。
するとあら不思議。一定の確率でゲームがメモリエラーを起こして止まっちゃう。

原因がマルチスレッドにあることは明白だった。しかしどう考えても同期はとれている。
いや、きっと凡ミスをしているに違いない・・・そういって約一週間。悩まされた。

ところが、知り合いのスーパープログラマーに聞けば衝撃の解答が。

「DirectX9はマルチスレッド推奨してないで。」



そうなのだ。調べるとすぐに出てきた。DirectXを作っているMicrosoft自体が

「推奨していません。」といっているではないか。

俺には
「推奨していませんwwwwwプギャーwwwww
 ねえ今どんな気持ち?wwwwねえ今どんな気持ち????wwwwww」
と見えたが・・・。

しかし、どうやらDirectX10以降は対応しているようだ。しかしまだそこに踏み入るには・・・
という段階。

もう白目だね。白目。泡吹いちゃう。
もうマルチスレッドでゲーム作っちゃってんだよ!!!くそったれ!!!!


・・・ふう。


そんなことは良いのだ。過去のことである。

DirectX9でのマルチスレッドの使用はすっぱり諦めることにする。

しかし、マルチスレッドの知識を無駄にしてはいけない。
今後DX10、11とシフトしていくかもしれない。
他の環境でマルチスレッドを使うかもしれない。

だから忘れてはならないのだ。
と思ったのだ。

なので、マルチスレッドに関して自分がすぐに理解できなかった部分をメモする。
記事が長くなったので、次の記事で書くことにしよう。

次は、今週中に。