我正在按照这个答案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);
答案 0 :(得分:0)
您只需使用常用的OpenGL绘图命令。只有那个而不是主窗口他们到一些屏幕外的famebuffer。最终你必须在其他地方绘制FBO的内容或将其读入文件。请注意,GLEW本身并不能为您提供OpenGL上下文。
OpenGL规范中没有任何内容表明OpenGL上下文必须绑定到显示系统。但遗憾的是,目前所有OpenGL GPU驱动程序都是基于这种假设而构建的,因此您必须运行某种显示系统并创建一个窗口(您可以将其隐藏/隐藏/取消映射)以创建OpenGL上下文。
请注意,GPU完全能够在没有显示系统的情况下执行OpenGL,它只是缺少的API。在Linux中使用OSS OpenGL驱动程序使用一些非常模糊的技巧,您实际上可以在不运行显示系统的情况下使用GPU。