OpenGL
常用库
- glfw3:窗口管理系统,需要display。
- glew:管理和加载OpenGL扩展的库,主要解决OpenGL应用开发中访问扩展API的复杂性问题。
代码片段
glfw离屏渲染
即便使用FBO进行离屏渲染,还是需要DISPLAY。(linux下就是X11,具体配置方式见[[IT知识/OS/Linux/实用指令#安装x11|X11配置]])
// GL环境初始化
glfwWindowHint(GLFW_SAMPLES, 16);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
if (!visible) {
glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
}
if (!resizable) {
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
}
// Initialize GLFW
if (!glfwInit()) {
check_gl_error();
fprintf(stderr, "Failed to initialize GLFW\n");
exit(-1);
}
// Open a window and create its OpenGL context
Window = glfwCreateWindow(width, height, name.c_str(), NULL, NULL);
if (Window == NULL) {
fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n");
glfwTerminate();
exit(-1);
}
glfwMakeContextCurrent(Window);
// Initialize GLEW
glewExperimental = true; // Needed for core profile
if (glewInit() != GLEW_OK) {
check_gl_error();
fprintf(stderr, "Failed to initialize GLEW\n");
exit(-1);
}
// Create the frame buffer.
glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
// Bind render target
glGenTextures(1, &FBOTexture);
glBindTexture(GL_TEXTURE_2D, FBOTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, FBOTexture, 0);
// for depth and cull
glGenRenderbuffers(1, &FBORenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, FBORenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, FBORenderBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, FBORenderBuffer);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
std::cerr << "Framebuffer is not complete!" << std::endl;
exit(-1);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);// 渲染前绑定frameBufferObject,这里绑定之后就不会去用glfwwindow默认的frameBufferObject了。
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
// 执行渲染动作
// ...
// 需要的话还可以readPixel
glReadPixels
// 使用完之后还原FBO
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// 最后释放
glDeleteTextures(1, &FBOTexture);
glDeleteFramebuffers(1, &FBO);
glfwDestroyWindow(GLWindow::Window);
glfwTerminate();