簡體   English   中英

計算着色器不會寫入緩沖區

[英]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);

盡管在參考文獻中未提及,但此頁面指示不允許將0解析為參數之一。 這可以解釋,因為num_group_x * num_group_y * num_group_z工作組,這意味着將使用此參數(1 * 1 * 0 = 0)創建非工作組。

要解決此問題,請嘗試致電

glDispatchCompute(1, 1, 1);
                        ^

相反,這將只創建一個工作組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM