首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建多采样FBO时出现OSMesa GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT错误

创建多采样FBO时出现OSMesa GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT错误
EN

Stack Overflow用户
提问于 2017-04-21 09:32:01
回答 1查看 462关注 0票数 0

我曾尝试使用OSMesa在我的linux服务器(没有显卡和窗口系统的虚拟机)上进行屏幕外渲染,请参阅osdemos演示。每件事都运行良好。

对于抗锯齿,我尝试创建一个多采样渲染缓冲区来绑定到FBO,但在GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT中,单个采样渲染缓冲区工作得很好。这是创建FBO的代码,更改1的sample_number,可以很好地工作,4的GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT错误。任何建议都是可取的。

代码语言:javascript
复制
#define GL_GLEXT_PROTOTYPES
#include <GL/glu.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <iostream>
#include "GL/osmesa.h"
#include <GL/glut.h>

const int Width = 1920;
const int Height = 1080;

int main(int argc, char *argv[])
{
   OSMesaContext ctx;
   void *buffer;

#if OSMESA_MAJOR_VERSION * 100 + OSMESA_MINOR_VERSION >= 305
   ctx = OSMesaCreateContextExt( OSMESA_RGBA, 32, 0, 0, NULL );
#else
   ctx = OSMesaCreateContext( OSMESA_RGBA, NULL );
#endif
   if (!ctx) {
      printf("OSMesaCreateContext failed!\n");
      return 0;
   }

   buffer = malloc( Width * Height * 4 * sizeof(GLubyte) );
   if (!buffer) {
      printf("Alloc image buffer failed!\n");
      return 0;
   }

   if (!OSMesaMakeCurrent( ctx, buffer, GL_UNSIGNED_BYTE, Width, Height )) {
      printf("OSMesaMakeCurrent failed!\n");
      return 0;
   }

   int render_width = 200, render_height = 200;

    enum { Color, Depth, NumRenderbuffers };
    // multi-sampled frame buffer object as the draw target
    GLuint framebuffer_ms, renderbuffer_ms[NumRenderbuffers];

    // generate color and depth render buffers and allocate storage for the multi-sampled FBO
    glGenRenderbuffers(NumRenderbuffers, renderbuffer_ms);
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_ms[Color]);
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, // here set 1 works fine
        GL_RGBA8, render_width, render_height);
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer_ms[Depth]);
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, // here set 1 works fine
        GL_DEPTH_COMPONENT24, render_width, render_height);

    // generate frame buffer object for the multi-sampled FBO
    glGenFramebuffers(1, &framebuffer_ms);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_ms);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
        GL_RENDERBUFFER, renderbuffer_ms[Color]);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 
        GL_RENDERBUFFER, renderbuffer_ms[Depth]);
    auto status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER);
   if (status == GL_FRAMEBUFFER_COMPLETE) {
      std::cout << "fbo status fine!!!" << std::endl;
   } else {
      std::cout << "Failed:" << status << std::endl;
   }
   exit(__LINE__);

    // render_image();
    // std::vector<GLubyte> data(width *height * 4);
    // glReadBuffer(GL_COLOR_ATTACHMENT0);
    // glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data.data());
    // write_targa(data.data(), width, height);
    glDeleteFramebuffers(1, &framebuffer_ms);
    glDeleteRenderbuffers(2, renderbuffer_ms);

    free(buffer);
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2017-04-24 09:54:03

只需使用后期处理来进行抗锯齿处理。pp_jimenezmlaa和pp_jimenezmlaaa_color

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43532454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档