使用glew绘制函数以进行屏幕外渲染
Draw functions using glew to do offscreen rendering
我正在关注这个答案链接
我包含了链接到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。
相关文章:
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- Winapi:屏幕截图未显示在窗口中
- 如何在快板的屏幕中显示子位图的绘制?
- 按回车键后输出屏幕关闭
- 为什么需要检查 GLAD 或 GLEW 是否正确初始化?
- 要在屏幕上绘制一些小瓷砖,我应该使用 QQuickItem 还是 QQuickPaintedItem?
- 现代OpenGL和GLEW Libraray的编译错误
- SFML 向下移动时如何围绕屏幕中心旋转?
- 截取屏幕截图后程序卡住
- 使用 CMake 和 Visual Studio 2019 编译 GLEW?
- 使用 MinGW 在 Windows 上构建 GLEW 时遇到问题
- 无法链接 GLEW 库
- C++鼠标单击时的屏幕截图不起作用
- 屏幕插入运算符<<的运算符过载问题
- OpenGL(GLFW/GLEW)中的屏幕上没有显示任何内容
- 使用glew绘制函数以进行屏幕外渲染