C++ 计算着色器赢得';不能写入缓冲区

C++ 计算着色器赢得';不能写入缓冲区,c++,opengl,glsl,opengl-4,C++,Opengl,Glsl,Opengl 4,我正在尝试使用计算着色器写入缓冲区 设置缓冲区: glCreateBuffers(1, &m_ssbo); glNamedBufferStorage(m_ssbo, 1920 * 1080 * 4 * sizeof(GLfloat), nullptr, GL_MAP_WRITE_BIT | GL_MAP_READ_BIT | GL_DYNAMIC_STORAGE_BIT); 计算着色器: #version 450 core layout (local_size_x = 1) in; l

我正在尝试使用计算着色器写入缓冲区

设置缓冲区:

glCreateBuffers(1, &m_ssbo);
glNamedBufferStorage(m_ssbo, 1920 * 1080 * 4 * sizeof(GLfloat), nullptr, GL_MAP_WRITE_BIT | GL_MAP_READ_BIT | GL_DYNAMIC_STORAGE_BIT);
计算着色器:

#version 450 core
layout (local_size_x = 1) in;
layout(std430, binding = 0) restrict writeonly buffer SSBO {
    vec4 color[];
};
void main() {
    color[0] = vec4(1., 0., 0., 1.);
}
发送和阅读:

m_comp_prog.use();
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_ssbo);
glDispatchCompute(1, 1, 0);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);

{
    auto * ptr = m_ssbo.map(0, static_cast<unsigned int>(sizeof(GLfloat)) * 4, GL_MAP_READ_BIT);
    GLfloat * fptr = static_cast<GLfloat *>(ptr);
    std::cout << fptr[0] << std::endl;
    m_ssbo.unmap();
}
m_comp_prog.use();
glBindBufferBase(GL_着色器_存储_缓冲区,0,m_ssbo);
glDispatchCompute(1,1,0);
glMemoryBarrier(GL_着色器_存储_屏障_位);
{
auto*ptr=m_ssbo.map(0,静态转换(sizeof(GLfloat))*4,GL_map_读取位);
GLfloat*fptr=静态铸件(ptr);

std::cout看起来您似乎从未执行着色器:

glDispatchCompute(1, 1, 0);
尽管参考中未提及,但指出不允许将0解析为参数之一。这可以解释为创建了工作组,这意味着使用此参数(1*1*0=0)创建了非

要解决此问题,请尝试拨打电话

glDispatchCompute(1, 1, 1);
                        ^
相反,它将只创建一个工作组