这个问题在这里继续主题:Unpack in a SSB

使用之前的设置,我发现自己无法使用Pixel Unpack缓冲区重置我的SSB。

我的初始化函数:

    //Storage Shader buffer
glGenBuffers(1, &m_buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffer);
glBufferData(
    GL_SHADER_STORAGE_BUFFER,
    1 * sizeof(uint),
    NULL,
    GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);

//Texture
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32UI, 1, 1);
glTexBufferRange(
    GL_TEXTURE_BUFFER,
    GL_R32UI,
    m_buffer,
    0,
    1 * 1 * sizeof(GLuint));
glBindTexture(GL_TEXTURE_2D, 0);

//Unpack buffer
uint clearData = 5;
glGenBuffers(1, &m_clearBuffer);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_clearBuffer);
glBufferData(
    GL_PIXEL_UNPACK_BUFFER,
    1 * 1 * sizeof(GLuint),
    &clearData,
    GL_STATIC_COPY);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

我的清算功能
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_clearBuffer);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexSubImage2D(
    GL_TEXTURE_2D,
    0,
    0,
    0,
    1,
    1,
    GL_RED_INTEGER,
    GL_UNSIGNED_INT,
    NULL);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);

清除功能不起作用。如果尝试使用glBufferSubData()访问缓冲区中的值,则返回BAADF00D。如果我使用一个简单的glBufferSubData()而不是upack操作,那么它可以工作。

如何使用像素解压缩缓冲区正确重置我的SSB?

回答:

问题是将我的纹理绑定(bind)到GL_TEXTURE_2D而不是GL_TEXTURE_BUFFER。但是,有一种更简单的方法可以在我的SSB内部解压缩:
m_pFunctions->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_clearBuffer);
m_pFunctions->glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
m_pFunctions->glCopyBufferSubData(
    GL_PIXEL_UNPACK_BUFFER,
    GL_ARRAY_BUFFER,
    0,
    0,
    1);
m_pFunctions->glBindBuffer(GL_ARRAY_BUFFER, 0);
m_pFunctions->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

这样,我什至不需要纹理。

最佳答案

您使用的texture buffer objects错误。您正在创建一个普通的2D纹理(包括实际的存储),然后似乎尝试定义该存储的缓冲区。您的glTexBufferRange()调用将失败,因为您没有将任何纹理对象绑定(bind)到GL_TEXTURE_BUFFER目标。

但是仅仅绑定(bind)m_texture也没有任何意义。 TBO的目的是使缓冲区对象可用作纹理。您不能通过纹理路径修改TBO内容,缓冲区纹理不允许使用glTex(Sub)Image / glTexStorage,您必须使用缓冲区更新机制。

我不明白为什么您甚至尝试通过纹理路径来做到这一点。修改基础数据存储就足够了。您只需通过 glCopyBufferSubData() 将PBO的内容(或想要使用的任何类型的缓冲区)复制到定义TBO存储的缓冲区中即可。或者,对于现代GL,最有效的方法可能是直接在SSBO上使用 glClearBufferData

07-28 03:57