フォト

Google AdSense


  • AdSense
無料ブログはココログ

« ディスプレイ情報の取得がDXGI 1.5でなくDXGI 1.6を必要とする理由 | トップページ | Build 2017のセッションLighting up HDR and advanced color in DirectX »

2017.09.12

GPUスキニングをCompute Shaderで実行するサンプル

Skinning in a Compute Shader
https://turanszkij.wordpress.com/2017/09/09/skinning-in-compute-shader/amp/

GPUスキニングをCompute Shaderで実行するというのは、今では結構やっているところが多い(さらにBlendShapeなんかも)と思うのですが、その入門的な記事がありますね。

GPUスキニングをCompute Shaderで実行する背景としては、現在のレンダリングパイプラインでは1つのスキニングするモデルを影のパス、Z-prepass、G-bufferパス、ライティングパスなど何度もDrawにつっこむようなケースで毎回頂点シェーダでスキニングを計算するのは無駄が多いというところにあります。

Direct3D10が登場したときは、Geometry ShaderとSteam Outputを駆使してスキニングをキャッシングして再利用する手法が生まれました(OpenGLならTransform Feedback)。

ただ、Geometry Shaderのパフォーマンス的なペナルティ(頂点シェーダも回るし)やSteam Outputをの使いにくさ(トライアングルストリップにされる)などが使い勝手が悪い部分でした。

Direct3D11になって登場した、Compute Shaderではそのあたりが、解消されてトライアングルリストでインデックスバッファなしで行けますね。

ところで、上記の記事では頂点バッファの各要素がByteAddressBuffer になっていますが、これはDirect3D11.0の制約ですね。Direct3D11.0ではStructured Bufferを頂点バッファにできないので、Direct3D12なんかだとこれがもうちょっと楽になるんじゃないかと思います。あとは、Async Computeにスキニングを投げることもできますね。

そのほかに、Direct3D11.1であれば、Compute Shaderではなく頂点シェーダだけで実行して、UAVに出力するという手もなくはないですね。これは元の頂点を読みだす点でパフォーマンスで有利かもしれません。ただ、これはAsync Computeに投げたりはできないですね。

« ディスプレイ情報の取得がDXGI 1.5でなくDXGI 1.6を必要とする理由 | トップページ | Build 2017のセッションLighting up HDR and advanced color in DirectX »

Programming」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« ディスプレイ情報の取得がDXGI 1.5でなくDXGI 1.6を必要とする理由 | トップページ | Build 2017のセッションLighting up HDR and advanced color in DirectX »