C++ 计算着色器不';不要改变纹理

C++ 计算着色器不';不要改变纹理,c++,opengl,glsl,compute-shader,C++,Opengl,Glsl,Compute Shader,我正在尝试使用计算着色器将纹理的颜色更改为黑色,但它不起作用,我也不知道为什么。着色器编译没有问题,程序链接也没有问题,因此我认为问题在于着色器的更新。这是我的密码: 更新: glUseProgram(m_programID); int location = glGetUniformLocation(m_programID, "img_out"); glUniform1i(location, 0); glBindImageTexture(0, texID, 0, GL_FALSE, 0, GL

我正在尝试使用计算着色器将纹理的颜色更改为黑色,但它不起作用,我也不知道为什么。着色器编译没有问题,程序链接也没有问题,因此我认为问题在于着色器的更新。这是我的密码:

更新:

glUseProgram(m_programID);

int location = glGetUniformLocation(m_programID, "img_out");
glUniform1i(location, 0);
glBindImageTexture(0, texID, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
glDispatchCompute(1024, 1024, 1);
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
int format;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format);
unsigned char* img = new unsigned char[1024 * 1024 * 4];
glGetTexImage(GL_TEXTURE_2D, 0, format, GL_UNSIGNED_BYTE, img);
int i = SOIL_save_image("img.bmp", SOIL_SAVE_TYPE_BMP, 1024, 1024, 4, img);
std::cout << SOIL_last_result() << std::endl;
delete[] img;

glUseProgram(0);
ps:这里使用的纹理是一个加载了土壤的图像,但这有关系吗?

尝试在glMemoryBarrier(GL_SHADER_image_ACCESS_BARRIER_BIT)之后调用glFinish()。我曾经遇到过一个问题,在读取计算结果之前,在使用该屏障时进行同步。这与CUDA-GL interop有关,但谁知道呢,也许你也有类似的东西…也可以看到你使用RGBA32F,但当你将纹理下载到CPU时,你使用的是RGBA8
#version 450 core

layout(local_size_x = 1, local_size_y = 1) in;

layout(binding = 0, RGBA32F) uniform image2D img_out;

void main()
{
    ivec2 pos = ivec2(gl_GlobalInvocationID.xy);
    imageStore(img_out, pos, vec4(0.f, 0.f, 0.f, 1.f)); 
}