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

时间:2015-03-20 10:55:10

标签: c++ opengl textures texture2d

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

// 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()之后

2 个答案:

答案 0 :(得分:2)

是,您必须分配存储空间(通过glTexStorageglTexImageglCopyTexImage等),然后才能将纹理数据上传到图片中。

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

答案 1 :(得分:1)

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

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