DirectX一覧

デプスバッファからワールド座標を復元

以前ディファードレンダリングを試していたときの続きネタになります。あのときにはワールド座標の位置も G-buffer に書き出していました。デプスバッファも別にセットして出力していたので、このデプスバッファを活用出来れば実は G-buffer としての出力テクスチャが1つ削減出来ます。


続きを読む


読み取り専用 DepthStencilView

今更ですがディファードレンダリングのコードを書いていました。ポイントライトをたくさんおける仕組みなのがいいですね。
古いタイプのレンダリングコードとはまた違った感じで、入力は既に描画したテクスチャを参照してデータが入ってくるのは新鮮でした。

そのときに、既に描画済みのデプスバッファを参照しつつも、デプステストは有効にしたいというようなケースでワーニングに出遭ってしまいました。

リソースハザードの発生

今回の場合では、デプスバッファがシェーダーへの入力と、パイプラインの出力(出力マージャー)に設定されているために、リソースハザードの警告が発生しました。
デプスステンシルステートで、 D3D11_DEPTH_WRITE_MASK_ZERO を設定して、書き込まれないようにしていてもこの警告は発生します。

ピクセルシェーダーで ShaderResource として読み込む設定だったため、以下の警告が VisualStudio で表示されました。

この警告への対応を考えます。

対応策

今回の例では ID3D11DepthStencilView をもう1つ作成することになりました。
読み込み専用としての ID3D11DepthStencilView を作成します。これは以下のようにして作成します。
フラグに D3D11_DSV_READ_ONLY_DEPTH を設定するのがポイントです。難点はこのフラグの存在に気付きにくいことでしょうか。

今更ですが、デプスバッファをテクスチャとして読み込むためには、デプステクスチャ作成時に BindFlags を D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE で作成します。このとき、フォーマットは DXGI_FORMAT_D32_FLOAT ではなく、 DXGI_FORMAT_R32_TYPELESS を使って作成しておく必要がありました。
DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_D32_FLOAT のフォーマットを指定して、各ビューの作成を行います。

感想

現時点においては簡単なものしか入れていないため、まだデプスバッファをINにもOUTにも設定して有効活用するといったところまでは到達していません。やろうと思ったら今までに説明した内容に出遭ってしまったので記事にしてみました。

デプスバッファを出力マージャーに設定しておきたいのはデプステストや Depth Bounds Test とかを活用したいという狙いです。
あとは、デプスを入力として参照したかったのは SSAO や ワールド位置の復元をこのバッファから出来れば、G-buffer に出さなくていい(削減できる)と考えたからです。



DwmGetDxSharedSurface を使ってみた

Windows の隠し API である DwmGetDxSharedSurface を使ってみました。
これは Windows7 以降で存在するようで、無事に Windows10 の環境でも使えました。
そのまま素直に使おうとするといくつか課題はありますが、面白い機能だと思ったので紹介することにしました。なお Undocumented API の1つなので、ご利用は自己責任で。

これは何?

指定されたウィンドウの画像をキャプチャすることが出来る API です。ウィンドウが他のウィンドウで隠されていても内容をキャプチャすることが出来ます。

続きを読む


Vulkan へ DirectX11 テクスチャをインポート

世の中の多くの Windows 環境で安定して使えるグラフィックス API は DirectX11 や OpenGL といったところだと思います。
Vulkan API は新しい API のため、既存のライブラリやフレームワークではまだサポートされていなかったりします。そのような状況のためか、 NIVIDA の Vulkan Extension では、 Vulkan とその他 API でやりとりするための機能が用意されました。

また現時点においては、 Khronos の KHX 拡張としても整備が進みそうな気配です。NVIDIA だけでなくサポート範囲が広がってくれることに期待です。

続きを読む



OpenGL と DirectX9 で共有リソース

HDD の中の実験コードらを整理していたらずいぶん前に作っていた NV_DX_interop 拡張を利用したコードを発見しました。
OpenGL と DirectX9 を1つのアプリケーションの中で使い、リソースを共有して使えるという点が魅力的です。

WGL_NV_DX_interop

この WGL_NV_DX_interop 拡張は名前の通り NVIDIA のベンダー拡張として定義されています。
詳しい説明は OpenGL Registry の https://www.opengl.org/registry/specs/NV/DX_interop.txt を参照してください。

この拡張では OpenGL と DirectX9 のリソースを共有を実現します。以下のリソースが共有できるようです。

  • テクスチャ(2D, 3D,Cubemap)
  • 頂点・インデックスバッファ

API をまたいで、リソースを使えるという点で非常に興味深いですね。
続きを読む



Windows10 IoT Core のアニバーサリーアップデート

デスクトップの Windows10 にアニバーサリーアップデートが来たように、 Windows 10 IoT Core についても アニバーサリーアップデートが来ました。今回はこれの導入手順や新機能などを紹介してみたいと思います。

導入について

以前にIoT Core を導入している場合で、 Windows 10 IoT Core Dashboard がインストールされている環境では、 Dashboard を起動すると以下のようにウィンドウが表示されて、更新を促されるので更新を行います。
win10-iot-update-01

ちなみに Windows 10 IoT Core Dashboard は以下のページから取得可能です。
Microsoft Windows 10 IoT Core Get Start
こららの詳細は、以前の導入記事を参照していただければと思います。

win10-iot-update-02
Dashboard から必要事項を入力して microSD カードにイメージデータを書き込みます
他に作業することはないのでしばらく待ちます。

書き込みが完了した microSD カードを Raspberry Pi 2 に装着して、電源をいれます。
初回起動にはそこそこの時間(5分程度)がかかるので、画面が落ち着くまで待ちます。

ちなみに OS のバージョンとしては 10.0.14393.0 となっていました
続きを読む


GPUView の導入について

以前とりあえず GPUView を起動させてみることはやってみました。今回はそんな GPUView をもっと簡単に試せる方法が見つかったのでブログにまとめてみます。

通常の方法

簡単に使える版の前に通常の導入・使用方法をまとめておきます。

Windows Performance Kit の導入

GPUView は Windows Performance Kit の一部として含まれています。現時点ではこれが所属するパッケージが OS の種類によって異なります。

続きを読む