我在 Nvidia 硬件上尝试了这段代码没有任何问题,但在 AMD 上,imageStore() 函数似乎没有做任何事情(虽然没有抛出 GL 错误,但我检查了)
着色器:
#extension GL_EXT_shader_image_load_store : require
layout(size4x32) uniform image2D A;
void main(void){
vec4 output = vec4(0.111, 0.222 , 0.333, 0.444);
imageStore(A, ivec2(gl_FragCoord.xy-vec2(0.5,0.5)), output);
}
调用程序:
glUseProgram(program);
glUniform1i(glGetUniformLocation (program , "A" ), id);
glBindImageTexture(id, texture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
//Bind the fbo associated with the texture to run a shader per pixel
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, width, height);
glDrawBuffer(GL_NONE); //Forbid gl_FragColor to be modified
//Render a quad
draw();
//Then read the texture...
正如 Nicol Bolas 在另一个线程中所建议的那样(imageStore() 出现问题(OpenGL 4.3)),我尝试添加一些障碍,以确保当我读回纹理但没有更改时写入内存,imageStore 的纹理应该写入未修改。
void main(void){
vec4 output = vec4(0.111, 0.222 , 0.333, 0.444);
memoryBarrier();
imageStore(A, ivec2(gl_FragCoord.xy), output);
memoryBarrier();
}
在主程序中:
...
draw();
glMemoryBarrierEXT(GL_ALL_BARRIER_BITS);
...
另一方面,如果我删除 glDrawBuffer(GL_NONE) 以简单地使用 gl_FragColor 输出我的值,它会像往常一样工作:
void main(void){
gl_FragColor = vec4(0.111, 0.222 , 0.333, 0.444);
}
但我真的需要用 imageStore 来做,因为我想使用分散写入。我也尝试使用 imageLoad 并且没有任何问题。这个 imageStore 函数发生了什么?
有任何想法吗?