返回
OpenGL 绘制图形的初步实践
IOS
2023-10-11 06:00:06
在理解了 OpenGL 的基本概念之后,笔者尝试通过一个小案例进一步了解 OpenGL 绘制图形的过程。如果还有对基本概念不够了解的同学,可以参看笔者的另一篇文章:《OpenGL 常⻅的专业名词》。
首先来看一下 main 函数实现,这部分的内容主要是初始化窗口、注册回调、设置渲染环境、开启事件循环等。
int main() {
// 初始化 GLFW 库
glfwInit();
// 设置窗口属性
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 创建窗口
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL);
if (window == NULL) {
glfwTerminate();
return -1;
}
// 将窗口设置为当前上下文
glfwMakeContextCurrent(window);
// 注册回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 开启事件循环
while (!glfwWindowShouldClose(window)) {
// 处理事件
glfwPollEvents();
// 清空缓冲区
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 绘制图形
glBegin(GL_TRIANGLES);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.0f, 0.5f);
glVertex2f(0.5f, -0.5f);
glEnd();
// 交换前后缓冲区
glfwSwapBuffers(window);
}
// 释放资源
glfwTerminate();
return 0;
}
在初始化完成之后,接下来就是设置渲染环境了。这一步主要是告诉 OpenGL 如何处理顶点数据和片段数据。
// 设置渲染环境
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
接下来就是绘制图形了。OpenGL 提供了多种不同的方式来绘制图形,这里我们使用最简单的glBegin()和glEnd()函数来绘制一个三角形。
// 绘制图形
glBegin(GL_TRIANGLES);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.0f, 0.5f);
glVertex2f(0.5f, -0.5f);
glEnd();
最后,我们还需要将前后缓冲区进行交换,这样才能将渲染结果显示在屏幕上。
// 交换前后缓冲区
glfwSwapBuffers(window);
以上就是 OpenGL 绘制图形的基本过程。希望这篇博文能帮助你更好地理解 OpenGL 的工作原理。
附:OpenGL 常⻅的专业名词
- 顶点(Vertex) :构成图形的基本单位。
- 片段(Fragment) :构成图像的最小单位。
- 着色器(Shader) :一种编写 OpenGL 程序的语言。
- 纹理(Texture) :用于给图形添加细节和颜色的图像。
- 缓冲区(Buffer) :用于存储数据的地方。
- 帧缓冲区(Frame Buffer) :存储渲染结果的缓冲区。
- 深度缓冲区(Depth Buffer) :存储深度信息的缓冲区。
- 模板缓冲区(Stencil Buffer) :存储模板信息的缓冲区。
- 着色器程序(Shader Program) :一组着色器,用于处理图形数据。
- 渲染管线(Pipeline) :OpenGL 处理图形数据的一系列步骤。