layout(set=0, binding=0) writeonly buffer destBuffer{ FLOAT data[]; } uOutput; layout(set=0, binding=1) readonly buffer sourceBuffer0{ int data[]; } uInput; layout(set=0, binding=2) readonly buffer sourceBuffer1{ FLOAT data[]; } uOn; layout(set=0, binding=3) readonly buffer sourceBuffer2{ FLOAT data[]; } uOff; layout(set=0, binding=4) uniform constBuffer{ ivec4 size; // x: outside, depth, inside, total } uConstant; layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in; void main() { ivec3 posTmp = ivec3(gl_GlobalInvocationID); if (posTmp.x < uConstant.size.w) { int inside = posTmp.x % uConstant.size.z; int tmp = posTmp.x / uConstant.size.z; int depth = tmp % uConstant.size.y; int outside = tmp / uConstant.size.y; FLOAT depthF = FLOAT(depth); FLOAT indice = FLOAT(uInput.data[inside + outside * uConstant.size.z]); FLOAT value = (abs(indice - depthF) < FLOAT(0.5)) ? uOn.data[0] : uOff.data[0]; uOutput.data[posTmp.x] = value; } }