计算着色器不会写入缓冲区

Posted

技术标签:

【中文标题】计算着色器不会写入缓冲区【英文标题】:compute shader won't write into buffer 【发布时间】:2016-02-01 17:33:01 【问题描述】:

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

设置缓冲区:

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();

但是输出是 0 而不是 1。

【问题讨论】:

【参考方案1】:

看起来好像您从未执行着色器:

glDispatchCompute(1, 1, 0);

虽然参考文献中没有提到,this page 表示不允许将 0 解析为参数之一。这可以解释,因为创建了num_group_x * num_group_y * num_group_z 工作组,这意味着使用此参数(1*1*0 = 0)创建非工作组。

要解决问题,请尝试致电

glDispatchCompute(1, 1, 1);
                        ^

相反,这将创建一个工作组。

【讨论】:

以上是关于计算着色器不会写入缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 片段着色器未写入 fbo 颜色缓冲区

OpenGL 计算着色器 SSBO

带字节的着色器存储缓冲区对象

打开 gl 计算着色器和帧缓冲区

奇怪的计算着色器延迟

OpenGL 计算着色器中的样本深度缓冲区