PBO是否在OpenGL上下文中共享?

时间:2018-07-16 16:54:26

标签: opengl

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->pboGLuintwidthheightu_int32_t

编辑2:我在上下文中使用GLFW。

2 个答案:

答案 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中说明了上下文共享。