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;
これが私の唯一の選択肢ですか?他の誰かがこの障害に遭遇します。