gpt4 book ai didi

c++ - GLSL - 在 SSB 中解压 (V2)

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:08 35 4
gpt4 key购买 nike

这个问题在这里继续这个主题: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 操作,它就可以工作。

如何使用 Pixel Unpack 缓冲区正确重置我的 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 不允许用于缓冲区纹理,您必须使用缓冲区更新机制。

我不明白你为什么要尝试通过纹理路径来做。 Modyfing底层数据存储就够了。您可以通过 glCopyBufferSubData() 将 PBO(或您想要使用的任何类型的缓冲区)的内容简单地复制到定义 TBO 存储的缓冲区中。 .或者,对于现代 GL,最有效的方法可能是使用 glClearBufferData直接在 SSBO 上。

关于c++ - GLSL - 在 SSB 中解压 (V2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23841612/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com