使用glew绘制函数以进行屏幕外渲染

Draw functions using glew to do offscreen rendering

本文关键字:屏幕 glew 绘制 函数 使用      更新时间:2023-10-16

我正在关注这个答案链接

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

现在绘图命令是什么?我以前用一个显示回调函数,用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);

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

OpenGL规范中没有规定OpenGL上下文必须与显示系统绑定。但不幸的是,现在所有的OpenGL GPU驱动程序都是基于这一假设构建的,所以你必须运行某种显示系统并创建一个窗口(你可以让它不可见/隐藏/未映射)来创建OpenGL上下文。

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