「 DirectX 」一覧

HLSL pow 関数の怪

pow 関数の挙動が昔と今で変わった!という話を聞いたので調査することにしました。

今回はスペキュラーの計算で使用している pow 関数の計算が妙なことになっているとのことだったので同じようにスペキュラの計算を行ってみることにします。なおインターネットで調べてみると、同じような症状に出遭っているような文面を見かけることができました。

傾き指向プログラミング / Direct3D 11のカリング設定
こちらの方では、「Specularの計算中powを使うのですが、これの結果がやたらとマイナスの値になるため、最終的に合算した色が真っ黒になるようです。」 と記述しています。
続きを読む


Draco を C++ と DirectX11 で触ってみる 後編

前回は draco のビルドと、サンプルのモデルデータをとりあえず読み込んで描画を行いました。今回は、モデルデータをコンバートする部分と、別のモデルデータの読み込みについて確認したいと思います。

コンバート

現時点において Draco をビルドすると ply, obj ファイルから drc ファイルを生成するコンバーターが付属しています。

使い方は以下のようになっていました。

MMDのモデルから変換する

MMDのモデル形式(PMD,PMX)から obj 形式を経由して変換してみました。PMDEditor で、 obj 形式でエクスポートすることが出来るようになっており、出力したファイルを draco_encoder に入力します.

続きを読む


Draco を C++ と DirectX11 で触ってみる 前編

Google の Draco が公開されています。これは 3D データ圧縮ライブラリでして、 Zip よりも効率よく圧縮ができるというのが特徴です。公開されたのは2017年1月ごろの話なので、ずいぶんと出遅れている状態ですがちょっと触ってみました。

効果的に使える場面は WebGL の環境だと思いますが、あえてデスクトップPC の DirectX11 でデータを描画するといったことを目標にします。前編では Draco の準備と初めてのモデルデータの読み込み、を行います。なお、 DirectX11 のプログラミングにおいて3角形は描画できるというという状態までは仕上がっているものとします。

続きを読む


ソフトパーティクルの実装方法

テクスチャとして読み込むデプスバッファと、アウトプットマージャーにセットしたデプスバッファでデプステストを使っての事例として、ソフトパーティクルがお題に合致している感じだったので試してみました。
ようやく読み込み専用 DepthStencilView を意味あるものとして使えたかなと思います。

ソフトパーティクル

ソフトパーティクルとは、パーティクルに使用するビルボードとモデルや背景の境界部分をぼかすことによって、ハードなエッジを見せないようにするための技法です。
ハードなエッジとは以下のようなものです。ソフトパーティクルを無効化して描画したものになります。

続きを読む



読み取り専用 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 だけでなくサポート範囲が広がってくれることに期待です。

続きを読む