OpenGL PBO 和纹理对象:我是否需要为两者分配内存

OpenGL PBO and texture objects: Do I need to allocate memory for both

我正在使用像素缓冲对象和纹理如下:

// Initialize PBO
Gluint _buffer;
Glenum target = GL_PIXEL_UNPACK_BUFFER
glGenBuffers(1, &_buffer);
if (_buffer) {
    glBindBuffer(target, _buffer);
    glBufferData(target, rows * cols * 4, NULL, GL_DYNAMIC_COPY);
    glBindBuffer(target, 0);
}

现在我将数据载入PBO如下:

glBindBuffer(target, _buffer);
GLubyte * data = (GLubyte *)glMapBuffer(target, GL_READ_WRITE);
memcpy(data, my_image_data, rows * cols * 4);
glUnmapBuffer(target);
glBindBuffer(target, 0);

我的问题是,当我将此 PBO 映射到纹理时,我是否也需要为纹理分配内存(本质上是进行复制)。或者我可以简单地映射它而不分配任何内存。

// Without allocation of texture memory
GLuint t;
glBindBuffer(target, t);
glGenTextures(1, &t);
glBindTexture(GL_TEXTURE_2D, t);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _cols, _rows,
                    GL_BGRA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glBindBuffer(target, 0);

或者我应该也有纹理的内存分配。所以这样的电话:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, cols, rows, 0, GL_BGRA, 
             GL_UNSIGNED_BYTE, (GLvoid *)NULL);

在 glBindTexture() 之后。

是的,您必须分配存储空间(通过glTexStorageglTexImageglCopyTexImage等)才能上传纹理数据成图像。

如果您尝试在没有分配存储的纹理上使用 glTexSubImage2D,它将失败。

简而言之,是的,您必须单独分配纹理。不幸的是,在 OpenGL 中,不可能将现有内存区域绑定到纹理采样器并像那样使用它。已多次尝试将其加入 OpenGL(超级缓冲区等,2004 年左右)。

能够使用具有不同功能单元的相同内存区域是人们渴望使用 Vulkan 的重要功能之一 API。