设置(Android 设备上的 OpenGL ES 3.1):
Compute_shader_clear(在 PROGRAM_A 中):
layout (local_size_x = 8, local_size_y = 8) in;
layout(rgba32f, binding=0) writeonly uniform mediump image2D write00;
void main() {
...
imageStore(write00, pixel, vec4(0.0));
}
Compute_shader_main(在 PROGRAM_B 中):
layout (local_size_x = 8, local_size_y = 8) in;
layout(rgba32f, binding=0) writeonly uniform mediump image2D write00;
void main() {
...
imageStore(write00, pixel, final_color);
}
两个计算着色器都指向同一个纹理(绑定零 = 图像单元零)
应用调用代码:
glUseProgram(PROGRAM_A);
glDispatchCompute(90, 160, 1);
glUseProgram(PROGRAM_B);
GLES31.glMemoryBarrier(GLES31.GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
glDispatchCompute(3, 160, 1);
...
这个设置似乎没有问题,但这种解释是否正确?:
屏障是必要的,因为两个调度命令可能同时运行。
屏障意味着在第一次调度中的所有 imageStore 调用完成之前,第二次调度中不会执行任何 imageStore。