本篇主要讲述关于glad库的使用、mac上如何使用OpenGL 3.3 Core模式,以及shader原理。
1. glad
由于OpenGL只是一套规范,具体的实现因显卡驱动和操作系统而异,比如在MacOS或Windows上,某些复杂点的OpenGL API函数指针并不一致。
为了在运行时在不同操作系统上找到对应的函数指针,glad库帮我们封装了这些操作,屏蔽了平台对的差异性。
我们可以通过这个glad在线生成器来获得对应的代码,按下图的选择,点击generate即可。
然后会获得一个glad压缩包,解压后有include和src代码,放到工程目录下,更新CMake file。
cmake_minimum_required(VERSION 3.0.0) project(learn_opengl VERSION 0.1.0) find_package(glfw3 3.3 REQUIRED) include_directories(third_party/glad/include) add_executable(learn_opengl main.cpp third_party/glad/src/glad.c) target_link_libraries(learn_opengl glfw "-framework OpenGL")
在代码中初始化glfw之后再初始化glad即可。
#include "glad/glad.h"
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; }
2. OpenGL 3.3 Core模式
我们即将涉及shader编程,需要OpenGL版本提升到3.3以上,同时由于MacOS的特殊之处,需要多设置一步GLFW_OPENGL_FORWARD_COMPAT。
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // MacOS兼容 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
同时,OpenGL Core模式要求绑定VAO(Vertex Array Object,顶点数组对象)用于处理顶点输入,不然OpenGL不会绘制出内容。
unsigned int VAO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO);
3. shader原理
shader(着色器)是一段类似C语言规范的程序,运行在GPU上。
一般地,shader有两类:vertex shader(顶点着色器)和fragment shader(片段着色器,又叫pixel shader像素着色器)。
有了shader,我们就可以更加灵活地命令OpenGL绘制出想要的效果。
当OpenGL进行绘制的时候,每次绘制顶点会调用一次vertex shader,而每次绘制一个像素点会调用一次fragment shader,可以看出,两种shader被调用的开销不是同一个量级的。
这篇文章很好地解释了shader是什么以及应用场景:Understanding Shaders, the secret sauce of 3D engines
一张图直观感受一下vertex shader和fragment shader(pixel shader)在整个绘制流程中所处的位置和作用。