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() 之后。
是的,您必须分配存储空间(通过glTexStorage
或glTexImage
或glCopyTexImage
等)才能上传纹理数据成图像。
如果您尝试在没有分配存储的纹理上使用 glTexSubImage2D
,它将失败。
简而言之,是的,您必须单独分配纹理。不幸的是,在 OpenGL 中,不可能将现有内存区域绑定到纹理采样器并像那样使用它。已多次尝试将其加入 OpenGL(超级缓冲区等,2004 年左右)。
能够使用具有不同功能单元的相同内存区域是人们渴望使用 Vulkan 的重要功能之一 API。
我正在使用像素缓冲对象和纹理如下:
// 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() 之后。
是的,您必须分配存储空间(通过glTexStorage
或glTexImage
或glCopyTexImage
等)才能上传纹理数据成图像。
如果您尝试在没有分配存储的纹理上使用 glTexSubImage2D
,它将失败。
简而言之,是的,您必须单独分配纹理。不幸的是,在 OpenGL 中,不可能将现有内存区域绑定到纹理采样器并像那样使用它。已多次尝试将其加入 OpenGL(超级缓冲区等,2004 年左右)。
能够使用具有不同功能单元的相同内存区域是人们渴望使用 Vulkan 的重要功能之一 API。