【问题标题】:Incomplete FBO when attaching RBO连接 RBO 时 FBO 不完整
【发布时间】:2019-06-19 18:47:28
【问题描述】:

我正在尝试将 RenderBuffer 对象附加到 FrameBuffer 对象,glCheckFramebufferStatus(GL_FRAMEBUFFER) 不断返回错误代码:GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

(我正在尝试附加一个 DepthBuffer)

这是我的代码(简化):

// Create and bind the new FBO (1920x1080)

GLuint gBuffer; 
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);


// Create, initialize, bind and attach the new RBO (purpose : depth buffering)

GLuint rbo;
glGenRenderbuffers(1, &rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);


// Create, bind, and initialize, and attach a texture (the FBO's Color Buffer)

GLuint idMap;
glGenTextures(1, &idMap);
glBindTexture(GL_TEXTURE_2D, idMap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, idMap, 0);

std::cout << std::to_string(glCheckFramebufferStatus(GL_FRAMEBUFFER)) << std::endl; // Gives me 36054 ( incomplete ???)


// Re-binding orignal FBO and RBO

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

我做错了什么?


我注意到的事情

不小心写了

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_COMPONENT16, GL_RENDERBUFFER, rbo);

代替

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbo);

...并且没有错误,但深度测试根本不起作用。

编辑:这仅仅是因为GL_DEPTH_ATTACHMENT 是附加缓冲区所必需的。它刚刚超出帧缓冲区...

在 FBO 中渲染时,我会这样做:

glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); // Use secondary FBO
glBindRenderbuffer(GL_RENDERBUFFER, rbo);   // Use secondary DepthBuffer
glDepthMask(GL_TRUE);                       // Allow depth writing
glEnable(GL_DEPTH_TEST);                    // Enable Depth testing
glDepthFunc(GL_LESS);                       // Pass if fragment is nearer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear color and depth buffers

Render(); 

glBindFramebuffer(GL_FRAMEBUFFER, 0);       // Go back to original FBO  
glBindRenderbuffer(GL_RENDERBUFFER, 0);     // to original Depth Buffer

【问题讨论】:

  • 您应该尝试将您的帖子改写为问题。目前,您的帖子是一系列声明。
  • @JoakimThorén 好的!编辑
  • @JoakimThorén 好点了吗?
  • 在附加rbo 时错误地指定GL_DEPTH_COMPONENT16 而不是GL_DEPTH_ATTACHMENT 导致FBO 被认为是完整的这一事实可能表明rbo 没有通过attachment complete 的要求。也许?
  • @G.M.我不知道你的意思是glRenderbufferStorage 的第二个参数必须是内部格式(例如GL_DEPTH_COMPONENT16 ),glFramebufferRenderbuffer 的第三个参数必须是深度缓冲区的GL_DEPTH_ATTACHMENT

标签: c++ opengl fbo depth-buffer


【解决方案1】:

已解决

我一步一步跟着这个教程:http://www.opengl-tutorial.org/fr/intermediate-tutorials/tutorial-14-render-to-texture/

此代码块丢失时会发生错误:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

这是纹理(颜色缓冲区)的参数。 特别是,只需要第二行即可避免GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 错误。

似乎在不设置一些纹理过滤参数的情况下添加深度缓冲区是行不通的。 (但是,它在只有一个颜色缓冲区时才有效,令人惊讶)

【讨论】:

  • 哦,是的,因为默认情况下GL_TEXTURE_MIN_FILTER 的值是GL_NEAREST_MIPMAP_LINEAR
  • 好的,现在说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多