PBO或任何类型的缓冲对象是否在OpenGL中的多个上下文(例如纹理)之间共享?
我最好的猜测是,否,因为以下代码不起作用:
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, lastFrame->pbo);
glDrawPixels(lastFrame->width, lastFrame->height, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
lastFrame-> pbo是由另一个GL上下文创建的缓冲区。 PBO的大小为4*lastFrame->width*lastFrame->height
。如果我不是绑定PBO,而是从内存(大小相同)上载数据,则可以正常工作
glDrawPixels
命令抛出GL_INVALID_OPERATION
。
编辑:lastFrame->pbo
是GLuint
,width
和height
是u_int32_t
编辑2:我在上下文中使用GLFW。
答案 0 :(得分:2)
第5章中的OpenGL specification 4.6说:
可以在上下文之间共享的对象包括缓冲区对象, 程序和着色器对象,renderbuffer对象,采样器对象, 同步对象和纹理对象(纹理对象除外) 命名为零)。
和
包含对其他对象的引用的对象包括帧缓冲区, 程序管道,查询,变换反馈和顶点数组对象。 这些对象称为容器对象,不会共享。
像素缓冲区对象(PBO)是缓冲区对象。因此它被共享。
您的GL_INVALID_OPERATION
错误可能是由于未将您使用某些gl-call的上下文设置为当前。或尝试一次将同一上下文设置为两个不同线程的当前上下文。
答案 1 :(得分:0)
问题是,PBO对象或任何类型的缓冲区对象是否会在OpenGL中的多个上下文(例如纹理)之间共享。
如@Ripi2's answer所述,GL规范允许在上下文之间共享缓冲区和纹理对象。但这并不意味着它们会自动共享。您必须创建共享 GL上下文才能使它起作用。
我将glfw用于上下文
GLFW documentation中说明了上下文共享。