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();