DirectX11一覧

DirectX11始めました

はじめに

Windows7 SP1やVisualStudio2010 SP1が出ている現在において、未だにDirectX11を扱うプログラムコードを作ったことがありませんでした。2011年4月と”11″繋がりで、ちょっとDirectX11を始めてみました。

いつものことですが、画面をクリアするまでの最小限サンプルをまずは作ってみようと思います。

昨年夏にDirectX10の記事も同じように書いたので、
DirectX10とDirectX11でどんなふうに変わったかも気付く範囲で書いてみます。

プログラムの流れ

手順としては以下のように実装をしていきます。

  1. スワップチェインとD3D11デバイスのセットアップ
  2. バックバッファを描画対象とするための設定
  3. バックバッファに対するデプス・ステンシルの準備
  4. 準備したデータを描画対象に設定
  5. メッセージループ
    1. バックバッファのクリア
    2. 表示バッファの更新

D3D11デバイスの作成

まずDXGIでスワップチェインの準備を行います。
DXGIはD3D11よりも低位に位置し、グラフィックスハードウェアの情報を扱うレイヤーになります。
スワップチェインはこのレイヤーに属します。
また、画面の解像度等を取得したいとき、フルスクリーン表示にしたいときにもDXGIにお世話になります。

このDXGIの設定についてはDirectX10のDXGIの設定をほぼ変わっていないようです。

続いて、機能レベルの設定です。
DirectX11では多くの環境で動作させることが出来るように設計されているので、
プログラムがハードウェアのサポート範囲をどこまでにするかを決めるために必要です。
ここでは以下のようにして、範囲を絞ってみました。

デバイスの作成

スワップチェインの設定と、機能レベルの設定を引数に設定して、
DirectX11のデバイスを作成します。
他の項目も色々とありますが、多くの場合はこのようなコードになると思います。

DirectX11からデバイス以外にも必要になるDirectXのオブジェクトがあります。
それは、上記のコードでいう pImmediateContext です。
どちらかというと、従来の環境でのデバイスはこのpImmediateContextが担当する感じです。

また、supportLevelの値を確認することで生成されたデバイスおよびコンテキストがどの機能レベルなのかを知ることが出来ます。

バックバッファの準備 -カラーバッファ設定-

DirectX11ではDirectX9と違い、バックバッファのカラーバッファの設定を自分でおこなう必要があります。
デバイス生成状態ではバックバッファは1つ存在します。
これを描画先とするために、ビュー(RenderTargetView)を作成します。

このビューを作成するまでのコードは以下のようになります。
この部分はDirectX10のときと全く同じです。

バックバッファの準備 -デプスステンシル設定-

カラー用はスワップチェインで用意されたバックバッファでしたが、
デプスやステンシルのバッファは自分で作成する必要があります。

  1. デプス&ステンシルのテクスチャを用意
  2. そのテクスチャをバックバッファとして扱えるようにビューを作成

このような手順で行います。

ビューを作成したら、テクスチャのインターフェースは解放しておきます。

描画先設定

今まで準備したバッファを描画対象として、デバイスに設定します。
デバイスに設定するのですが、pImmediateContext、すなわち、ID3D11DeviceContextインターフェースに対して設定します。

このID3D11DeviceContextに対して設定する部分が D3D10と違いますね。

画面のクリア

クリア処理は、デバイスに対して行うという感じではなく、
コンテキストに対して、クリアするビューを設定して行う、という感じになっています。

後始末

感想

DirectX10をやっていれば、そこまで大きく変わった感じはしないですね。
今までデバイスに指示していたのがデバイスコンテキストへ指示と変えたくらいです。

今回のソースコード

HelloDX11 ダウンロード


DirectX11ちょっと調べてみた

DirectX11環境でのDX9ハードウェア

DirectX11(D3D11)では、DX9ハードウェア上でも動作します。
正確には、DX9相当の機能を使う分には動作できるという感じです。

使用するAPIを変えなくてもDX9ハードウェアからDX11ハードウェアまで
動作できるというのは魅力ですが、何もしなくても動作するというのとはちがうようです。

新しい環境でも、古い環境でもそれぞれの出来る範囲で動作するということを考えたときには、
ハードウェアが備えているレベルに応じて処理を切り替えることが必要になります。

たとえば、DX10相当のハードとDX9のハードでは、使用できる定数レジスタのサイズが全く違います。軽く試してみたところ、vs_4_0_level_9_3のプロファイルで、大きな定数バッファを使用するHLSLシェーダーファイルはコンパイルに失敗します。

まぁ、そうなるだろうと予測していましたが、納得の症状です。

よって、ハードウェアを見ながら使用するシェーダーを変更する、ということが
それぞれの環境での最良のパフォーマンスを引き出すのには必要になります。


書籍かってきた ちょっとだけDirectX11

DirectX11に興味があってそろそろ触らなきゃなぁと思っていたところ、
”ちょっとだけDirectX11”という書籍が最近出たので購入してみました。早速ですが、ちょっと残念な点がいくつか。

統合型シェーダーアーキテクチャ

これ、GPUの部分についてのアーキテクチャなのですが、
本文中では、DirectX側の変更点のように読み取れました。

統合型シェーダーアーキテクチャを採用した DirectX10が登場しました

DirectX10で必要とする機能を効率よくハードウェアで実現するためには、
単に統合型シェーダーアーキテクチャを採用するほうが都合がよかっただけで。

また、DirectX9であっても、統合型シェーダーアーキテクチャのビデオボードであれば、
動くわけですし。

マルチサンプル

書籍の後半でこの単語があったので、読んでみるとどうやら思っていたのと違う。
やっていることとしては、”マルチテクスチャ”でした。
てっきりぼかしや何かのテクニックのために、1つのサンプラから複数点を取得する意味での
マルチサンプル(マルチサンプリング)かと思いきや・・・。

よかった点

Direct2Dについて説明してある部分と、
D3D11でのEffectがうまく動かなかったという記載はよかったと思います。
試そうとして、うまくいかないっていうことを1つ避けられたように思います。

でも、別にエフェクトファイルでやらなくてもいいのでは?と思ったり。
VS/GS/PSそれぞれシェーダーを設定するようにしても、
このくらいのサンプルなら複雑にならないような気がします。