使用glew绘制函数来执行屏幕外渲染

时间:2014-09-21 18:01:10

标签: c++ opengl glew

我正在按照这个答案link

我包含glew.h,链接到glew32s.lib并成功编译和链接。

现在什么是绘图命令?我曾经使用过显示回调函数,并使用glutDisplayFunc(myDisplay);glutMainLoop()来绘制。

我现在应该使用哪些绘图功能来绘制缓冲区?

谢谢!

我的代码:

#define GLEW_STATIC
//...
#include <GL/glew.h>
#include <GL/glut.h>
#include <GL/glu.h>
//...
int main(int argc, char *argv[]) {
    //...
    //This initializes glut
    glutInit(&argc, argv);

    //This tells glut to use a double-buffered window with red, green, and blue channels 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

    // Initalize theviewport size
    viewport.w = 400;
    viewport.h = 400;

    //The size and position of the window
    glutInitWindowSize(viewport.w, viewport.h);
    glutInitWindowPosition(0,0);

    glutCreateWindow(argv[0]);
    if(GLEW_OK!=glewInit()){return -1;}

    GLuint fbo, render_buf;
    glGenFramebuffers(1,&fbo);
    glGenRenderbuffers(1,&render_buf);
    glBindRenderbuffer(GL_RENDERBUFFER,render_buf);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB8, viewport.w, viewport.h);
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);
    glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, render_buf);



    //Before drawing
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER,fbo);


    myDisplay();
    savePNG(outputPNGName,0,0,viewport.w,viewport.h);

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

    //At deinit:
    glDeleteFramebuffers(1,&fbo);
    glDeleteRenderbuffers(1,&render_buf);
}

// and whatever else

return 0;

}


savePNG:

glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(x, y, width, height, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)image);

1 个答案:

答案 0 :(得分:0)

您只需使用常用的OpenGL绘图命令。只有那个而不是主窗口他们到一些屏幕外的famebuffer。最终你必须在其他地方绘制FBO的内容或将其读入文件。请注意,GLEW本身并不能为您提供OpenGL上下文。

OpenGL规范中没有任何内容表明OpenGL上下文必须绑定到显示系统。但遗憾的是,目前所有OpenGL GPU驱动程序都是基于这种假设而构建的,因此您必须运行某种显示系统并创建一个窗口(您可以将其隐藏/隐藏/取消映射)以创建OpenGL上下文。

请注意,GPU完全能够在没有显示系统的情况下执行OpenGL,它只是缺少的API。在Linux中使用OSS OpenGL驱动程序使用一些非常模糊的技巧,您实际上可以在不运行显示系统的情况下使用GPU。