imageStore()不适用于AMD硬件(OpenGL 4.2)

时间:2013-04-24 13:16:01

标签: opengl glsl shader

我在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函数发生了什么?

有什么想法吗?

1 个答案:

答案 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进行比较即可找到更多信息。