2016-07-21 14 views
2

DirectX 12の最初の会話を見たときに、テクスチャアトラスの必要性がなくなったと思いました。しかし、今や私が文書を読むことになった今、明らかな結論にはならない。私はそれはそれはHLSL内のリソースの配列の動的な不均一なインデックスで置き換えることができます見てきましたDirectX 12はテクスチャアトラス処理の必要性を排除しますか?

一つの特徴:

Texture2D<float4> textures[128]; 
SamplerState sampler; 

textures[NonUniformResourceIndex(textureIndex)].Sample(sampler, uv); 

別の潜在的な機能はまだ別々の引き分けと資源の束であるかをコードし、ExecuteIndirectです1回のCPUコールでバッファへの呼び出しを変更し、一度にGPUに送信します。

どちらもテクスチャアトラス(アトラス領域のボーダモードを使用できない、問題のあるミップマッピング)の制限に対処しますが、性能特性がテクスチャアトラスに似ていると思われますか、まだ正当化された。

また、回答がマントル、バルカン、メタルに一般化されているかどうか不思議です。

答えて

3

答えは「はい」です。長い答えは、アトラスにわずかなパフォーマンスの利点があるケースがあるかもしれません。

DX12とVulkanを使用すると、Mantleを忘れることができます。ディスクリプタを使用したテクスチャの現在の表現は、金属に近いです。バインドレスを使用するとパフォーマンスが大幅に低下したり、通常のテクスチャのテクスチャフェッチ、またはバインドレスのものが現在のハードウェアでは同じで、未来はそれが行く方法です。

nVidiaでは、絶対にペナルティはありません。NonUniformResourceIndexは、アーキテクチャの要件ではありません。

(AMD)の場合、NonUniformResourceIndexにはシェーダコードの生成に関する含意があります。シェーダコードの生成には、乗算するとコストがかかります。理想的には、一度に複数のインデックスを使用する描画呼び出しを使用しないでください(1つのインスタンスまたは複数のインスタンスで)。これは、GPUがベクトルレジスタとスカラーレジスタの組み合わせを使用するためです。テクスチャおよびサンプラ記述子は、スカラレジスタにロードされます。あなたのテクスチャに異なるインデックスがある場合、それは正しく機能しません。 NonUniformResourceIndexは、アクティブスレッド上でループを生成し、インデックスを消費し、スレッドをマスキングし、フェッチを行い、すべてのスレッドを処理するまでループします。しかし、これらの考慮事項を無視して、バインドされていないテクスチャは、通常のバインディングと同じシステムを使用します。

ExecuteIndirectも非常に良いことですが、ドライバでは完全に最適化されているとは限りませんが、DX12エンジンが搭載されているゲームが増えれば改善されます。このAPIはgpuのカリングと、さらに多くのCPUの作業を減らすための多くのソリューションのオープンドアです。 Xbox Oneでは、PipelineStateObjectを変更することも可能です。

+0

これはすべて非常に良い情報です!私の使用例は、スプライトシートを使用せずにスプライトを描画するようなものなので、テクスチャインデックスは異なる対の三角形(四角形)のピクセル間で分岐する可能性があります。私はスプライトがごくわずかではない場合、ATIでさえ、非常に少数のワープが発散することになると思います。 – Trillian

+0

その場合、非一様なインデックスタグを使用する必要がありますが、ほとんどの波は単一のインデックスを参照し、シェーダのオーバーヘッドは無視してください。パーティクルで大量のオーバードローを行っている場合は、フルスクリーンの計算パスで手動でラスタライズすることもできます。 – galop1n

関連する問題