前々から色々と試したいと思っていたDirectX11を今回ようやく試してみることにしま
した。とりえずここやここを参考に、ポリゴンとテクスチャの描画やコンピュートシェーダを
実装してみたので、今まで使用していたDirectX9との違いと利点についてまとめて
みようと思います。
・デバイスロスト処理が不要
他のサイトでも色々説明されてますが、デバイスロストしなくなりました。
ただしGPUのドライバ更新時はロストするとかしないとか(まぁ実行中にドライバ更新
する人なんてまずいないと思いますが)。
・D3Dデバイスが3つに分離
従来のD3DデバイスがD3Dデバイス、デバイスコンテキスト、スワップチェインの3つに
分離しました。具体的にはD3DデバイスがVRAMリソースの作成、デバイスコンテキスト
がGPUに描画コマンドを発行、スワップチェィンがウィンドウへの描画を実行といった
感じに担当が分かれています。何故こんな面倒なことになったのかというとこれは自分
の予想なのですが、コードを見渡してみるとロード周りはD3Dデバイスを使用し、描画
周りはデバイスコンテキストとスワップチェインを使用するといった風に見事に分かれて
いるため、マルチスレッドで次のシーン読み込みを行っている場合従来のようにD3Dデバ
イスをクリティカルセクション等で制御する必要がなくなっているのです。つまり、処理を
高速化させるためにこういった分離がされているのだろうなと推察しました。
・Shader Model4.0
SM4.0では従来のGPUの構造とは全然違うので、シェーダ命令数が無限です(
ちなみにWebGLのGLSLも命令数が無限ぽいのでおそらくSM4.0以上で動作させて
んだろうと思います。
・フューチャレベル
WindowsVista以降ではDXGIという新しいシステムによってDirectX9,10,11での
GPUへのアクセスを共通化できるようになったのでDirectX11SDKからはフューチャ
レベルというものを使用してD3DデバイスをDirectX9.x,10,10.1,11のいずれかの
モードで作成出来るようになりました。
なので実は自分の環境はDirectX11に対応していないのですが、DirectX10.1で
DirectX11SDKを利用している訳です;
・Compute Shader
従来のシェーダは1プリミティブがシェーダに渡されて対応した1プリミティブを返すと
いった感じでしたが、Compute Shaderでは構造化バッファという構造体のバッファを
利用して任意の位置のデータを拾って来たり、任意の位置にデータを渡したり出来ます。
つまりCPUで計算するのと同じように処理出来ます。更にこの恩恵はピクセルシェーダに
も適応され、SM4.1,5.0ではピクセルシェーダでも一部の構造化バッファにアクセス
出来るようです(この辺はまだ試していないので何とも言えませんが)。
更に新しいDirectX11.1+SM5.1ではピクセルシェーダだけでなく全てのシェーダから
もアクセス出来るようになるとのことで、GPUがCPUとほとんど同じような働きが出来る
ようになるのではないかと思います。
ちなみにCompute ShaderはいわゆるGPGPU用なので従来のパイプラインと同じ
流れの中で処理するのではなく、Compute Shaderから開始してCompute Shader
で終了する、いわば唯我独尊シェーダです笑。
パッと思いつく限りこんな感じです。ただ利点ばかりではなく欠点もそれなりにあるわけで。
例えばD3DX算術関数がサポートされていないので、D3DX算術関数を利用する場合は
D3DX10math.hとd3dx10.libを読み込んDirectX10の機能を借りなければならないです。
更にはHLSLコードも含めて、DirectX9とは仕様ががらりと違うのでDirectX9を一から
覚えるのと同じ位面倒だと感じました。なまじDirectX9の作法が頭に入っていると混乱
するみたいなところがあるので新しく触る方はお気を付けください。