DirectX12一覧

RaspberryPi2 で DirectX12 を

最近 DirectX12 をさわり始めていましたが、 なんと Raspberry Pi 2 にインストールした Windows10 IoT Core Insider Preview でも d3d12.dll が存在することを発見したので、ワクワクしながらテストしてみました。

rpi2-d3d-dlls

プログラムコードは以下のようなものでテストしました。まずはデバイスを生成するところが成功しないと話にならないので、そこから確認したいと思います。

とりあえずアダプタを適当に取得してそこからデバイスを生成するようにしています。列挙して渡している理由は、列挙しないとデバイス生成に成功しないとかいう情報があったためです。

実行結果

さてこれらを Raspberry Pi2 で動作させるとどうなるか試してみました。
結果は、失敗でした。アダプタの列挙箇所では2つほど存在するように動作しているようですが、いずれも D3D12CreateDevice の結果は 「指定されたデバイスインターフェースまたは機能レベルがこのシステムでサポートされていません」でした。 DirectX12 の場合には最低でも D3D_FEATURE_LEVEL_11_0 を要求してしまうため、これ以上は機能レベル変更できないので仕方ないようです。
 その一方で DirectX11 版の D3D11CreateDevice は成功して、使用される機能レベルも D3D_FEATURE_LEVEL_11_1 が返ってきた点は納得がいきませんが、プレビューということで今のところはあきらめておきます。

その他

今回試していて気付いたのは、ビデオアダプタは Microsoft Basic Render Driver が使われているということでした。 RPI2 に搭載されているアダプタは VideoCore IV だったと思いますが、コレ用の専用ドライバという感じではなさそうです。以前のパフォーマンスが出ないという点については、専用ドライバではないから、というのが可能性として大きい気がしました。もしかしてこのアダプタはいわゆるソフトウェア補助のある WRAP デバイス的な何かでしょうか。


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

以前は VS2015 CTP6 と Windows10 10041 で画面クリアのサンプルを作りましたが、既に今現在はそのコードはビルド不可能な状態になってしまいましたので、再度作り直すことにしました。本当に色々とあってようやく画面クリアまで出来るようになりました。

注意事項

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

必要なもの

  • VisualStudio 2015 RC
  • Windows10 Insider Preview 10074
  • AMD RADEON の新しいドライバ(15.200.1023.0)

ここで新しいドライバというのが大事です。つい最近Windows Update で提供されました。それまではドライバの不具合で DirectX12 の初期化が正常に行えませんでした。

DirectX12 プログラミング

通常の Win32 アプリケーションを作成します。ウィンドウの作成関連は割愛して、DirectX12 部分だけ抜粋していきます。

初期化処理

まずはコードを先に示します。画面クリアするのに必要になるものだけを生成していますが、コード量は多めです。

このコードについて簡単に説明していきます。
最初にデバッグ情報を多く出してくれるようにするための設定をしています。DXGIにも DXGI_CREATE_FACTORY_DEBUG フラグを渡していますし、 D3D12 もデバッグ情報を出してくれるようにするために D3D12GetDebugInterface でインターフェースを取得して有効化しています。従来は CreateDevice でフラグを渡す、でしたが今回から変わったようです。
 また、本来ならばアダプタを列挙して処理が必要になるのかもしれませんが、ここでは最初のアダプタに対して D3D12CreateDevice をするようにしています。コメントにあるように DirectX12 のデバイスは最低でも D3D_FEATURE_LEVEL_11_0 の機能レベルを要求するようです。

 その後、コマンドアロケーター、コマンドキューを作成したあと、スワップチェインを作成します。ここでは2つのバックバッファチェインを持つようにして初期化をしています。また カレントのバックバッファインデックスを取得するために、DXGI の IDXGISwapChain3 で作成することにしました。

 さらにその後、コマンドリストを作成し、レンダーターゲットのディスクリプタを格納するためのオブジェクトを作成していきます。ディスクリプタヒープには先ほどのスワップチェインのバックバッファ数分だけのレンダーターゲットビューを準備しておきます。このとき、ディスクリプタヒープのポインタのインクリメントサイズがデバイスから取得できます。

描画処理

初期化のコードが終わったので、画面クリアの描画ループについて説明します。基本的にはクリアのコマンドをコマンドキューに設定して(積んで)、実行をキックする、その後コマンド完了を待って画面に描画、という感じです。
ただし、クリアの際には描画先のリソースをリソースバリア処理(関数)を用いて状態を変更していく必要があります(SetResourceBarrier関数)。これから扱うリソースがどの状態になるのか、正しく変更されるか、といったためにこんな仕組みになっているのだろうと予想しています。バッファの扱いが柔軟になったため故だと思います。
 描画に関しては以下のようなコードとなっています。

まとめ

ようやく現在の状況での正常に動くコードを作成できました。とはいってもまだ画面クリアだけですが、最初の1歩を再び歩み出せたと思います。従来のコードからは変更箇所は多いですが、考え方そのものは変わっていないなと思います。

ソースコードについて

今回のソースコードの全貌は GitHub に上げてあります。気になる方はそちらを参照していただければと思います(https://github.com/techlabxe/testD3D12 の HelloDX12 )。


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 では初期化に成功するところまで到達できました(しかし、まだクリア処理まで到達できず)。


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 をフルインストールしたら結構時間がかかってしまったので、簡単に確認できたところだけ紹介したいと思います。 続きを読む