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