【问题标题】:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT from the shared second context来自共享的第二个上下文的 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
【发布时间】:2016-04-20 17:26:44
【问题描述】:

我需要在两个 OpenGL 上下文之间共享颜色/深度/模板缓冲区。 2D 纹理附加到缓冲区的帧缓冲区对象。代码如下:

// === Start of context 1
//
Create _hDC1, _hRC1;
wglMakeCurrent(hDC1, hRC1);
glGenFramebuffers(1, &_FBO1);
glBindFramebuffer(GL_FRAMEBUFFER, _FBO1);

// color buffer
glGenTextures(1, &_color1);
glBindTexture(GL_TEXTURE2D, _color1);
glTexParameteri(GL_TEXTURE_2D, ..., ); // GL_TEXTURE_WRAP_S, ..., etc.
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA16F, 512, 512);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _color1, 0);

// depth buffer
glGenTextures(1, &_depth1);
glBindTexture(GL_TEXTURE2D, _depth1);
glTexParameteri(GL_TEXTURE_2D, ..., ); // GL_TEXTURE_WRAP_S, ..., etc.
glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, 512, 512);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, _depth1, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, _depth1, 0);

// check completeness
GLenum  status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
assert(status == GL_FRAMEBUFFER_COMPLETE); // *pass fine here*

// detach _FBO1
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
glReadBuffer(GL_NONE);
glDrawBuffer(GL_NONE);
//
// === End of context 1


// === Start of context 2
//
Create _hDC2, _hRC2; // pixel format is same as _hDC1
wglShareLists(_hRC2, hRC1); // share objects between _hRC1 and _hRC2
wglMakeCurrent(_hDC2, _hRC2);

// Create another frame buffer, since it is not sharable
glGenFramebuffers(1, &_FBO2);
glBindFramebuffer(GL_FRAMEBUFFER, _FBO2);

// Use the shared textures for color/depth/stencil buffers
glBindTexture(GL_TEXTURE2D, _color1);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _color1, 0);
glBindTexture(GL_TEXTURE2D, _depth1);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, _depth1, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, _depth1, 0);

// check completeness
GLenum  status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
assert(status == GL_FRAMEBUFFER_COMPLETE); // *fail here, status is GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT*
//
// === End of context 2

第二次完整性检查总是失败。

  • 尝试在附加颜色缓冲区后立即移动第二次完整性检查,但同样失败。
  • 还尝试在创建第二个上下文之前取消绑定 _color 和 _depth,但是没有帮助。
  • glGetError() 在每次 OpenGL 调用之后被放置,并且没有检测到错误。

来自https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCheckFramebufferStatus.xml

并非所有帧缓冲区连接点都是完整的帧缓冲区连接。这意味着至少有一个附加了渲染缓冲区或纹理的附加点的附加对象不再存在,或者附加的图像的宽度或高度为零,或者颜色附加点附加了不可颜色渲染的图像,或者深度附加点附加了不可深度渲染的图像,或者模板附加点附加了不可模板渲染的图像。

无法弄清楚错过了什么。在网上查了几篇帖子,但没有一个和我的用例相同。

【问题讨论】:

    标签: opengl textures fbo


    【解决方案1】:

    啊哈,我在调用 wglShareLists() 时弄乱了参数顺序,应该是:

    wglShareLists(_hRC1, hRC2);
    

    现在一切正常。我应该对其进行错误检查。

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      相关资源
      最近更新 更多