这个问题在这里继续主题: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
。