我在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(Trouble with 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函数发生了什么?
有什么想法吗?
答案 0 :(得分:0)
我可能和你的AMD卡有同样的问题。然后,我在http://www.g-truc.net/project-0026.html#menu
查看了OpenGL Sample Pack的源代码在研究与imageStore相关的源代码时,我发现为纹理添加以下两行使我的代码适用于AMD(java中的代码)
gl.glTexParameteri(GL2.GL_TEXTURE_2D,GL2.GL_TEXTURE_MIN_FILTER,GL2.GL_NEAREST); gl.glTexParameteri(GL2.GL_TEXTURE_2D,GL2.GL_TEXTURE_MAG_FILTER,GL2.GL_NEAREST);
如果它不适合您,只需将您的代码与OpenGL Sample Pack进行比较即可找到更多信息。