2011-06-18 9 views
0

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; 

を行う上で、これは私の唯一のオプションですか?他の誰もがこの悩みに遭遇する。

答えて

0

私は決してありませんでした。しかし、65000のスレッドはひどいもののようです。

次に、documentationを検索しようとすると、渡す値はスレッドではなくスレッドグループであるようです。 Someone on gamedevは、768のような数字を渡すときにパフォーマンス上の問題があるようだから、その巨大な数字を減らさなければならないと思う。

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

+0

私はスレッドグループのことについて知っています。私のシェーダは、厳密には1つのスレッドの問題です。私がやっていることは、2つの配列を追加するより少し複雑です。 しかし、あなたは65535スレッドがひどく、何かを誤解しているかもしれないということは間違いありません。私はかなりの時間Direct3Dを使用してきましたが、OpenGLに精通していますが、これはDirectCompute/OpenCL/CUDAの領域に入って初めてです。 –

関連する問題