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() を使用するだけで問題ありません。テクスチャの交換のため、次のイテレーションから再度読み取る前に、すべての値を更新する必要があります。これが何らかの形で可能かどうか、誰かに考えがありますか?
ありがとうマルク