0

DirectComputeを使用して頂点のスキンを作成しようとしています。採用されているスキニングの方法は、各頂点に影響を与えるさまざまな量の重みを持つことができるようなものです(たとえば、Md5メッシュはこのように定義されます)。

基本的に、計算シェーダーへの入力は次のとおりです。

JointsBuffer { float4 orientation, float4 position } Structured buffer SRV
WeightsBuffer { float3 normal, float4 position, float bias, uint jointIndex } Structured buffer SRV
VerticesBuffer { float2 texcoords, uint weightIndex, uint numWeights } Structured buffer SRV

出力は

SkinnedVerticesBuffer { float3 normal, float4 position, float2 texcoord } Structured buffer UAV

ここで、計算シェーダーは頂点バッファー内の要素ごとに1回実行する必要があり、SV_DispatchThreadIDを使用して、シェーダーはVerticesBuffer内のすべての頂点に対してSkinnedVerticesBuffer内の対応するSkinnedVertexにデータを入力しようとします(1:1対応)。

したがって、問題は、多くのメッシュに65535を超える頂点があり、DispatchThreadIDコマンドでは、ディメンションごとにその数のスレッドしかディスパッチできないことです。これで、理論的には、多くの数を65535未満の3つの要素の組み合わせに分割するものを書くことができますが、素数の場合はそれができない可能性があります。

たとえば、71993(素数)の頂点を持つメッシュが表示された場合、それを処理する方法を考えることはできません。

コンテキスト->Dispatch(36000、2、0)で72000スレッドをオーバーディスパッチすることはできません。これは、DispatchThreadIDがバッファ境界を使い果たしてしまうためです。

現在、頂点の数を保持する一定のバッファに傾いており、次に最も近い2の累乗にディスパッチしてから、単純に実行しています。

if( SV_DispatchThreadID > numVertices ) return;

これが私の唯一の選択肢ですか?他の誰かがこの障害に遭遇します。

4

1 に答える 1

0

一度もない。しかし、65000 スレッドは非常に多くのように思えます。

次に、ドキュメントを見つけようとすると、渡す値はスレッドではなく、スレッド グループのようです。gamedev の誰かが、768 という大きな数値を渡すとパフォーマンスに問題があるようです。そのため、その巨大な数値を減らす必要があるように思えます。

よくわかりませんが、これらのパラメーターを誤解していると感じました。これらの値が実際に何を意味するのかをもう一度読んでみてください。(あくまで素人の感覚ですが。)

于 2011-06-18T08:18:57.363 に答える