1

glsl 計算シェーダーを使用して 32x32x32 の 3D テクスチャの伝播スキームを実装しようとしています。シェーダーを 1 回実行するだけで x 回の反復を実行できれば非常に便利です。

3 つのテクスチャがあります。1 つはソース、1 つはターゲット、3 つ目はすべてを蓄積します。ソースとターゲットは、反復ごとに交換する必要があります。擬似コードは OpenGL のようになります。

glUseProgram(computeShaderId);
glBindImageTexture(0, srcTexId, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
glBindImageTexture(1, targetTexId, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
glBindImageTexture(2, accumulateTexId, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
glDispatchCompute(32,32,32);

GLSL:

#version 430
layout (local_size_x = 1, local_size_y = 1, local_size_z =1) in;
layout(rgba32f) uniform image3D srcTex;
layout(rgba32f) uniform image3D targetTex;
layout(rgba32f) uniform image3D accumulateTex;

void main() {
  ivec3 currentPos = ivec3(gl_GlobalInvocationID.xyz);

  for (int i=0;i<8;i++){
    //accumulate the values of the 6 neighbours (top,bottom,left,right,front,back)
    //by usind the current sourceTexture
    //this involes  loadImage 
    vec4 neighbourValues=getValuesFrom6Neighbours(currentPos, currentSource);

    storeImage(currentTarget,currentPos,neighbourValues);

    vec4 value=loadImage(accumTex,currentPos);
    storeImage(accumTex,currentPos,neighbourValues+value);

    //the texture are swapped, which I have a solution for so no problem here
    swapSrcAndTarget();

    //here is the Problem how to synchronize all different shader invocations?
    someKindOfBarrier();
  }

問題は、テクスチャのサイズが原因で、1 つのワークグループでこれらすべてを実行できないことです。1 つのワークグループ内であれば、barrier() を使用するだけで問題ありません。テクスチャの交換のため、次のイテレーションから再度読み取る前に、すべての値を更新する必要があります。これが何らかの形で可能かどうか、誰かに考えがありますか?

ありがとうマルク

4

1 に答える 1