计算着色器不会写入缓冲区
compute shader won't write into buffer
我正在尝试使用计算着色器写入缓冲区。
设置缓冲区:
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。
看起来好像您从未执行过着色器:
glDispatchCompute(1, 1, 0);
虽然参考文献中没有提到,this page 表示不允许将 0 解析为其中一个参数。这可以解释,因为创建了 num_group_x * num_group_y * num_group_z
个工作组,这意味着没有使用此参数创建 (1*1*0 = 0)。
要解决问题,请尝试调用
glDispatchCompute(1, 1, 1);
^
相反,这将创建一个工作组。
我正在尝试使用计算着色器写入缓冲区。
设置缓冲区:
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。
看起来好像您从未执行过着色器:
glDispatchCompute(1, 1, 0);
虽然参考文献中没有提到,this page 表示不允许将 0 解析为其中一个参数。这可以解释,因为创建了 num_group_x * num_group_y * num_group_z
个工作组,这意味着没有使用此参数创建 (1*1*0 = 0)。
要解决问题,请尝试调用
glDispatchCompute(1, 1, 1);
^
相反,这将创建一个工作组。