C++ OpenGL PBO和纹理对象:我需要为两者分配内存吗
我使用像素缓冲区对象和纹理,如下所示:C++ OpenGL PBO和纹理对象:我需要为两者分配内存吗,c++,opengl,textures,texture2d,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); glBind
// 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);
}
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中,如下所示:
// 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);
}
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
,则会失败。是,在能够将纹理数据上载到图像之前,必须分配存储(通过glTexStorage
或glTexImage
或glCopyTexImage
等)
如果尝试在没有分配存储的纹理上使用
glTexSubImage2D
,则会失败。是,在能够将纹理数据上载到图像之前,必须分配存储(通过glTexStorage
或glTexImage
或glCopyTexImage
等)
如果尝试在没有分配存储的纹理上使用
glTexSubImage2D
,则会失败。是,在能够将纹理数据上载到图像之前,必须分配存储(通过glTexStorage
或glTexImage
或glCopyTexImage
等)
如果尝试在没有分配存储的纹理上使用
glTexSubImage2D
,则会失败。简而言之,是的,您必须单独分配纹理。不幸的是,在OpenGL中,不可能将现有内存区域绑定到纹理采样器并像那样使用它。在将其引入OpenGL(大约在2004年,superbuffers等)方面已经有过多次尝试
在Vulkan API中使用相同的内存区域和不同的功能单元的能力是人们渴望得到的一件大事。简而言之,是的,您必须单独分配纹理。不幸的是,在OpenGL中,不可能将现有内存区域绑定到纹理采样器并像那样使用它。在将其引入OpenGL(大约在2004年,superbuffers等)方面已经有过多次尝试
在Vulkan API中使用相同的内存区域和不同的功能单元的能力是人们渴望得到的一件大事。简而言之,是的,您必须单独分配纹理。不幸的是,在OpenGL中,不可能将现有内存区域绑定到纹理采样器并像那样使用它。在将其引入OpenGL(大约在2004年,superbuffers等)方面已经有过多次尝试
在Vulkan API中使用相同的内存区域和不同的功能单元的能力是人们渴望得到的一件大事。简而言之,是的,您必须单独分配纹理。不幸的是,在OpenGL中,不可能将现有内存区域绑定到纹理采样器并像那样使用它。在将其引入OpenGL(大约在2004年,superbuffers等)方面已经有过多次尝试
使用不同功能单元使用同一内存区域的能力是人们渴望使用Vulkan API的一件大事。是的,我希望有一种方法可以锁定内存区域,也许可以使用它,但感谢您确认这是不可能的。甚至在之前,使用
GL_APPLE_client_storage
(2002):)这些天你可以使用纹理缓冲区对象。是的,我希望有一种方法可以锁定内存区域,也许可以使用它,但感谢你确认这是不可能的。甚至在以前,使用GL\u APPLE\u client\u storage
(2002):)这些天你可以使用纹理缓冲区对象。是的,我希望有一种方法可以锁定内存区域,也许可以使用它,但感谢您确认这是不可能的。甚至在以前,使用GL\u APPLE\u client\u存储(2002):)这些天,您可以使用纹理缓冲区对象。是的,我希望有一种方法可以锁定内存区域,或许可以使用它,但感谢您确认这是不可能的。甚至在以前,使用GL\u APPLE\u client\u存储(2002):)这些天,您可以使用纹理缓冲区对象。