Opengl es 2个计算着色器,1个glMemoryBarrier=OK?
设置(android设备上的OpenGL ES 3.1): 计算着色器清除(在程序中): Compute_shader_main(在程序中): 两个计算着色器都指向同一纹理 (绑定零=图像单元零) 应用程序调用代码: 此设置似乎可以正常工作,但此解释正确吗Opengl es 2个计算着色器,1个glMemoryBarrier=OK?,opengl-es,glsl,compute-shader,opengl-es-3.1,Opengl Es,Glsl,Compute Shader,Opengl Es 3.1,设置(android设备上的OpenGL ES 3.1): 计算着色器清除(在程序中): Compute_shader_main(在程序中): 两个计算着色器都指向同一纹理 (绑定零=图像单元零) 应用程序调用代码: 此设置似乎可以正常工作,但此解释正确吗 屏障是必要的,因为两者都有可能 调度命令可以同时运行 屏障意味着不会在中执行imageStore 第二次分派,直到在第一次分派中调用所有imageStore 发送完毕 屏障是必要的,因为两个调度命令可能同时运行 从技术上说是的,但更恰当的理由
如何实现是一个实现细节。可能有硬件可以通过某种方式的排序操作并发执行这些命令。诚然,大多数实现很有可能会像您所说的那样:在执行后续命令之前,请等待执行之前的命令并清除缓存。谢谢Nicol,非常感谢您的时间
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));
}
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);
...