0

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

有任何想法吗?

4

1 回答 1

0

我的 AMD 卡可能和你有同样的问题。然后我查看了 OpenGL 示例包的源代码:http ://www.g-truc.net/project-0026.html#menu

在研究这个与 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 示例包进行比较即可找到更多信息。

于 2013-04-29T07:32:12.053 回答