DirectComputeを使用して頂点をスキンしようとしています。使用されるスキニングの方法は、各頂点に影響するさまざまな重みを持たせることができます(たとえば、Md5メッシュはこのように定義されます)。65535を超えるスレッドをディスパッチする
計算シェーダーへの入力は基本的にです。
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
であり、そして使用は、すべての頂点についてSkinnedVerticesBufferに対応SkinnedVertexを移入するシェーダ試みSV_DispatchThreadID VerticesBuffer(1:1対応)にある。
したがって、問題は、多くのメッシュが65535を超える頂点を持ち、DispatchThreadIDコマンドでディメンションごとに多数のスレッドをディスパッチできることです。今私は理論的には、65535未満の3つの要因の組み合わせに多くの数値を分割するものを書くことができますが、私はおそらく素数に対してはできません。
例えば、71993(素数)の頂点を持つメッシュが現れたとき、それを処理する方法は考えられません。
DispatchThreadIDが私のバッファ境界から使い果たされるため、context-> Dispatch(36000,2,0)で72000スレッドをオーバーディスパッチできません。
今、私は頂点の量を保持する定数バッファに傾いていて、その後、2の最も近いパワーに派遣して、単に
if(SV_DispatchThreadID > numVertices) return;
を行う上で、これは私の唯一のオプションですか?他の誰もがこの悩みに遭遇する。
私はスレッドグループのことについて知っています。私のシェーダは、厳密には1つのスレッドの問題です。私がやっていることは、2つの配列を追加するより少し複雑です。 しかし、あなたは65535スレッドがひどく、何かを誤解しているかもしれないということは間違いありません。私はかなりの時間Direct3Dを使用してきましたが、OpenGLに精通していますが、これはDirectCompute/OpenCL/CUDAの領域に入って初めてです。 –