「 2015年04月 」一覧

DirectX9 と DirectX9Ex の違いをテクスチャの観点から


DirectX 9.0Ex では D3DPOOL_MANAGED が使えなくなりましたが、基本的にはデバイスロストが発生しなくなりました。そのため D3DPOOL_DEFAULT を使ってリソースを作成しても問題がなくなりました。もっとも D3DPOOL_DEFAULT でなければリソース生成に失敗してしまいますが。こんな便利になった DirectX 9.0Ex があまり注目を浴びていなかったようなのと、ちょっとした差異があるようだったので記事にしてみました。以降、 DirectX9 を DX9, DirectX9.0Ex を DX9EX と表現します。

基本的にはより厳密な制御を求められるようになった感じです。
従来の DX9 で D3DPOOL_MANAGED でリソースを作成し、何も気にせず Lock メソッドを使った場合、システムがよろしく制御を行ってくれました。パフォーマンスロスなどは発生しますが、動作はしていました。これもデバッグランタイムを使用していれば警告メッセージ等は出ていたかと思います。しかし、 DX9EX ではこれらについてエラーとなるようです。

ここではテクスチャについて見ていきます。

これは DirectX 9.0 では問題が発生しなかったコードです。しかし D3D9EX では、CreateTexture で失敗してしまいます。先ほど述べたように D3DPOOL_MANAGED が使えないためです。ここを D3DPOOL_DEFAULT にしてみると、テクスチャの生成には成功しますが、後続の LockRect で失敗します。このときのエラーメッセージは以下のように表示されました。

というわけでLockで書き込む際には D3DUSAGE_DYNAMIC が必要なようです。このことは、 D3DPOOL_MANAGED で作成し、LockRect にてテクスチャからの読み込みのコードを書いていた場合に失敗するということを意味しています。頻繁な読み書きをする場合には D3DUSAGE_DYNAMIC が必須という感じです。
 恐ろしいことに、D3D9 において Lockのフラグで D3DLOCK_READONLY をつけて読み込みロックをしていた場合でも D3DPOOL_MANAGED では書き込みすることが出来てしまいました。しかもそれが反映されるケースもありました。 D3D9EX では書き込み結果は反映されません。正しい挙動をしているといえます。

D3D9EX でテクスチャをCPUで読み書きする場合には、 D3DUSAGE_DYNAMIC フラグが必要といえると思います。このフラグさえ設定しておけば D3D9 のコードと他の部分は違いはなく動作できそうです。
逆に初期化だけで使えるスタティカルなテクスチャはどう作成するかを考えてみたところ、CPU上でのスステージングテクスチャを作成して、それを転送するという方法が考えられます。手順の擬似コードとしては以下のようになります。

まとめ

頂点およびインデックスバッファも同様ですが、一番違いの影響を受けそうなテクスチャについて調査してみました。

DirectX 9.0 Ex のよい点はデバイスロストからの解放だけでなく、フルスクリーンで自分のプログラムを動かした際に、他のプログラムに対してもデバイスロストを発生させないというのもあります。他のプログラムが DirectX 9.0だったとしても自分のプログラムが 9.0Ex でフルスクリーン化しても向こうもデバイスロストにならないのです。


DirectX12 でポリゴンを3D描画する その2


前回はポリゴンを3Dで表示できましたが、実は1つ問題点がありました。気付いている方もいるかと思いますが、デプスバッファがないため、複数のポリゴンから構成されるデータを描画した場合にはうまく描画できません。下図の右側のような結果を期待しても、左側のような感じになります。今回はこのデプスバッファを作って右側のような結果となるように改良したいと思います。

dx12_cube

注意事項

繰り返しの内容となりますが、以下の点をご了承ください。

現時点において DirectX12 の部分はプレビュー版となっています。正式版では大きく変更される可能性があります。よってここの情報は 2015/04 現在の限定された環境でのみ動作するという点をご理解ください。

また以下の内容は間違っている点もあるかと思います。その点にはご注意ください。

本内容は既に最新環境では正常にコンパイルできません。ご注意ください 2015/5

デプスバッファを使用した描画

キューブのデータ等はリポジトリのほうを参照してください。ここではデプスバッファを作るあたりと設定する部分を抜粋して説明していきます。

デプスバッファの作成

以下のような感じでデプスバッファ用のディスクリプタヒープやリソースを準備します。 続きを読む


DirectX12 でポリゴンを3D描画する


前回でポリゴンは描画することが出来ました。今回はこのポリゴンを3D空間上で回してみたいと思います。幸いにも DirectXMath が普通に使えるようで、今回は行列をシェーダーに渡す、「定数バッファ(コンスタントバッファ)」を DirectX12 でどのように生成&使用するのかといった点がポイントとなります。
本内容は既に最新環境では正常にコンパイルできません。ご注意ください 2015/5

注意事項

繰り返しの内容となりますが、以下の点をご了承ください。
現時点において DirectX12 の部分はプレビュー版となっています。正式版では大きく変更される可能性があります。よってここの情報は 2015/04 現在の限定された環境でのみ動作するという点をご理解ください。また以下の内容は間違っている点もあるかと思います。その点にはご注意ください。

dx12_moving_triangle

ポリゴンを回す

知っての通りポリゴンを回すために、ワールド行列、ビュー行列、プロジェクション行列を用います。これらの演算には DirectXMath を使用してしまいます。この行列を格納した定数バッファを準備する必要があるので、ここから確認していきます。
また今回は定数バッファ1つを使う前提で処理します。そのためややこしいディスクリプタヒープ等は使わないで設定する方向でいきます(自分自身あまりまだ理解できていなかったりするので) 続きを読む


DirectX12 で最初のポリゴン描画


前回は DirectX12 (D3D12) を初期化して画面のクリアを行うまでの手順でした。ようやく1つの三角形ポリゴンを描画するところまで手順がわかったので説明したいと思います。

注意事項

繰り返しの内容となりますが、以下の点をご了承ください。

現時点において DirectX12 の部分は実装途中となっています。正式版では大きく変更される可能性があります。よってここの情報は 2015/04 現在の限定された環境でのみ動作するという点をご理解ください。

なおMSDNドキュメントですら不十分な状況で手探りで動作させたため、以下の内容は間違っていることが多く含まれる可能性があります。その点にはご注意ください。

本内容は既に最新環境では正常にコンパイルできません。ご注意ください 2015/5
dx12_triangle

最初の三角形描画

前回で画面のクリアまでの手順については把握できたので、今回は初めての描画に必要なデータを用意するところから説明します。なお以前のコードからリファクタリングしたコードをベースとして今回は作成しています。 GitHub にコードをあげてありますので気になる人は(&全貌を確認したい人)はそちらを参照お願いします。 続きを読む


DirectX12 で画面クリアまでの最小サンプル実装


DirectX12 を使っての画面クリアまでの処理について、先日の内容をより洗練させることができました。前回のものは手探り状態だったのもあって無駄な部分が紛れ込んでいました。具体的には、実は RootSignature はもっと簡単でよかったこと、 ID3D12DescriptorHeap は1つでも実装上問題なかったことです。
多くの部分で繰り返しとなりますが、改めて画面クリアまでの実装をチュートリアル的に確認していきたいと思います。
本内容は既に最新環境では正常にコンパイルできません。ご注意ください 2015/5

注意事項

現時点において DirectX12 の部分は実装途中となっています。正式版では大きく変更される可能性があります。よってここの情報は 2015/04 現在の限定された環境でのみ動作するという点をご理解ください。

なおMSDNドキュメントですら不十分な状況で手探りで動作させたため、以下の内容は間違っていることが多く含まれる可能性があります。その点にはご注意ください。


2015/04/11 従来実装と違いアロケーター1つで処理できるようにできたため該当部分だけコード例を修正しました。正しい内容は、GitHubのコードリポジトリをご参照ください。

必要なもの

  • VisualStudio 2015 CTP6
  • VisualStudio Tools for Windows10 Technical Preview
  • Windows10 Technical Preview 10041

d3d12_clear

とりあえず上記のように画面のクリア処理がうまく動くようになりました。結構手間取ったので喜びもなおさらです! 続きを読む


DirectX12 で画面クリアまで (祝)


DirectX12 (D3D12) を使ってようやく画面のクリアだけエラーも起こらず動作させることができるようになりました。そもそも SDK が正式版ではないので、今後変更されることもあると思います。それでも気になる人のために、コードをさらしてみたいと思います。Windows8.x以降、 Win32 アプリケーションは肩身が狭くなってきた感がありますが、ここでのサンプルは相変わらず Win32アプリケーションで作成してみました。
以下の内容は既に古くなっています。以下のコードでも動きますが、よりコード量の少なくなったこちらの記事を参考にどうぞ
本内容は既に最新環境では正常にコンパイルできません。ご注意ください 2015/5

必要なもの

VisualStudio 2013 でも作業できそうに思いますが、すべて最新の状況で作業しました。作業している最中に Windows10 は 10049 に上がっちゃいましたが。以下のものをインストールしました。

  • VisualStudio 2015 CTP6
  • VisualStudio Tools for Windows10 Technical Preview
  • Windows10 Technical Preview 10041

d3d12_clear

とりあえず上記のように画面のクリア処理がうまく動くようになりました。結構手間取ったので喜びもなおさらです! 続きを読む