「 DirectX 」一覧

DirectX12 の初期化が成功しない Build 10074とVS2015RC


どうにもこうにも DirectX 12 のインターフェースが変わってからというもの、自分の環境で DirectX12 の初期化 D3D12CreateDevice が成功しない状況でした。試行錯誤していたのですが、原因がやっとわかりました。

その理由というのが Catalyst Driver の問題というもので、Build 10.0.10074 broke Direct3D 12 on most recent Catalyst WDDM 2.0 driver とあります。
このドライバのバージョンは 15.200.1018.1 (2015/04/01版) となっていました。このバージョンが新しくなるまではダメそうです。

他の環境であれば成功するらしいので、RADEON を使用している人はしばらく待ちな感じです。ハードウェアがちゃんと対応しているのは RADEON だと思っているので、こいつがちゃんと使えないとは残念です。AMD しっかりしてほしいところです。さらに他の環境としては VirtualBox にインストールしてみた Windows10 では初期化に成功するところまで到達できました(しかし、まだクリア処理まで到達できず)。


Raspberry Pi 2 向け Windows10 IoT Core Insider Preview で DirectX11 アプリ


前回の内容と手順自体はほとんど変わらないで、 DirectX11 のテンプレートを使用するだけで Raspberry Pi 2 でも動作することを確認できました。動作は今のところ重いですが・・・。

DirectXアプリのプロジェクト

プロジェクトの作成は Visual C++ / Windows / Windows Universal / DirectX App (Windows Universal) を選びます。

vs2015rc-directxapppi2-project

プロジェクトが作成されたら、 x86 の構成ではなく ARM の構成を選びます。あとはデバッグの設定を前回と同様に Raspbery Pi 2 のIPアドレスを設定します。以下の図は前回の流用です

windows10-iot-debug-conf

これで実行すると Raspberry Pi 2 の画面で以下のようにキューブが回っているのを確認できます。1280×1024 という解像度でおよそ 17FPS でした。強引に 640×480 にしてみましたがそれでも 40FPS 程度. HARDWAREデバイスが DirectX 11.1 で作成されており問題はなさそうなのですが、正式版が出る頃にはパフォーマンスアップしているといいなぁと思います。

DSC_0388


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

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


DirectX12を触ってみた(不完全)


DirectX12 (D3D12) を使って画面のクリアまでは簡単にやれるかなと思っていたのですが、そこまでたどり着けませんでした。先日のドキュメント参照しながらやっているだけでは不十分で、ちょっと試行錯誤&ヘッダの探索なども必要でした。

自分の現状ではこんなところですが、これからトライされる方々にちょっとでも参考になればと思って、いくらかメモを残しておこうと思います。以下の項目は自分がとても時間がかかってしまったポイントばかりです。

なお、正式な情報が見当たらないため、ここにある情報も正しいどころか間違っている可能性もとても高いのでその辺はご了承くださいませ。なお以下の話はすべて Win32Application で C++ のみでやってます。

GetDefaultCommandQueue は無い

ドキュメントでは ID3D12Device から GetDefaultCommandQueue なる API があるように書かれていますが、実際のところは存在しません。
これについては、 D3D12_COMMAND_QUEUE_DESC に値をセットして自分で明示的に ID3D12CommandQueue を作成して対処しました。

SwapChainの作成

ドキュメントの方では ID3D12Device から QueryInterface で IDXGIDevice2 インターフェイスを取得するようになっています。しかしながら手元の環境ではこのインターフェースを取得することが出来ませんでした。 WARP デバイスが悪いのかと思い、 GCN 世代のボードと換装してトライしましたが同様の結果でした。
結局のところは CreateDXGIFactory2 関数から IDXGIFactory2 をもらうことでスワップチェインの作成を行っています。

ID3D12CommandListについて

ID3D12CommandList ではなく、 ID3D12GraphicsCommandList を生成する必要があるようです。そうしないと、グラフィックス用のいろいろなメソッドが使用できませんでした。たとえば、 SetDescriptorHeaps, ClearRenderTargetView など。
また、直接はコマンドキューに積めないので、 CommandListCast というキャスト用関数を介してキューに積むようにしています。これもヘッダの中を探索していて発見した関数です。もしかしたらMSDN ドキュメントに記載があったかもしれませんが・・・。

以降は、さらに不確定さ怪しさが高いので、概要だけにしておきます。 続きを読む


ついにDirectX12 を触れるようになったようです!


Windows 10 Technical Preview と VisualStudio 2015 Preview CTP6 により、とうとう一般の開発者でも DirectX12 (D3D12) のプログラムを作れる&試せるようになってきました。また MSDN のドキュメントとしても次の場所に公開されたので、 dll だけあるけど使い方がわからないというような状況から抜け出せたようです。

このような状況になったので、手元の物理 PC に早速 Windows10 Technical Preview (Win10TP) をインストールし、VS2015CTP6 も導入を開始しました。 CTP6 をフルインストールしたら結構時間がかかってしまったので、簡単に確認できたところだけ紹介したいと思います。 続きを読む