解压在SSB(Unpack in a SSB)

2019-10-29 15:53发布

我使用的是SSB的一部分链表的矩阵3D。 该基质的每个像素是一个UINT,使该列表的第一个元素的位置。

每个渲染之前,我需要重新初始化这个矩阵,而不是整个SSB。 因此,我相关联对应于与纹理1D中的矩阵的一部分,以便能够解开它里面的缓冲剂。

//Storage Shader buffer
glGenBuffers(1, &m_buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_buffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, 
    headerMatrixSizeInByte + linkedListSizeInByte, 
    NULL, 
    GL_DYNAMIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);

//Texture
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_1D, m_texture);
glTexBufferRange(
    GL_TEXTURE_BUFFER, 
    GL_R32UI, 
    m_buffer, 
    0, 
    headerMatrixSizeInByte);
glBindTexture(GL_TEXTURE_1D, 0);

//Unpack buffer
GLuint* clearData = new uchar[m_headerMatrixSizeInByte];
memset(clearData, 0xff, headerMatrixSizeInByte);
glGenBuffers(1, &m_clearBuffer);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_clearBuffer);
glBufferData(
    GL_PIXEL_UNPACK_BUFFER, 
    headerMatrixSizeInByte, 
    clearData, 
    GL_STATIC_COPY);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
delete[] clearData;

因此,这是初始化,现在这里是清楚的尝试:

GLuint err;
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_clearBuffer);
glBindTexture(GL_TEXTURE_1D, m_texture);
err = m_pFunctions->glGetError(); //no error
glTexSubImage1D(
    GL_TEXTURE_1D,
    0, 
    0,  
    m_textureSize, 
    GL_RED_INTEGER, 
    GL_UNSIGNED_INT, 
    NULL);
err = m_pFunctions->glGetError(); //err GL_INVALID_VALUE
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
glBindTexture(GL_TEXTURE_1D, 0);

我的问题是:

  1. 是否有可能做什么,我试图?
  2. 如果有,在哪里我搞砸了?

Answer 1:

由于安东再次谁得到了一半的答案。 有在上面的代码的两个问题:

  1. m_textureSize = 32770这超过了许多硬件在一个维度上限制。 最简单的解决方法是使用一个纹理2D。 因为我不关心在缓冲区链表后的内容,我可以写任何我想要它。 在接下来的渲染调用,它将在着色器覆盖。
  2. 当创建的质感,一个函数调用丢失: glTexStorage2D(GL_TEXTURE_2D, 1, width, height);


文章来源: Unpack in a SSB