--- title: OpenGL-基础程序 cover: https://pic.biss.click/image/2fcb9566-f7f6-4132-81cb-4cd646967519.webp categories: - 技术 - 学习 series: OpenGL tags: OpenGL abbrlink: 437a5198 summary: >- 这篇文章详细介绍了OpenGL的基础程序,包括代码展示和代码解释两部分。代码展示部分呈现了一个简单的OpenGL程序,涵盖了初始化与窗口管理、状态设置与缓冲区操作、矩阵与坐标变换以及几何图形绘制等关键步骤。代码解释则将这些步骤按照功能类别进行了归纳,帮助读者更好地理解OpenGL的渲染流程。通过这个示例,读者可以初步掌握OpenGL的基本操作和概念。 date: 2026-04-11 18:20:34 --- # 代码展示 我们先从基本的OpenGL程序开始吧,这是一个简单的OpenGL程序: ```cpp #include using namespace std; // 回调函数 void myDisplay() { // 清除缓冲区 glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); // 正交模式 glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 500.0, 0.0, 500.0); glColor4f(0.0, 1.0, 0.0, 0.0); glRectf(50.0, 50.0, 400.0, 400.0); // 划线 glColor3f(1.0, 1.0, 0.0); glBegin(GL_LINES); glVertex2f(50.0, 50.0); glVertex2f(400.0, 400.0); glVertex2f(400.0, 50.0); glVertex2f(50.0, 400.0); glEnd(); // 画点 glColor3f(1.0, 0.0, 0.0); glPointSize(20.0); glBegin(GL_POINTS); glVertex2f(15.0, 15.0); glEnd(); // 画三角形 glBegin(GL_TRIANGLES); glColor3f(0.0, 0.0, 1.0); glVertex2i(200, 300); glVertex2i(100, 100); glVertex2i(300, 100); glEnd(); glFlush(); } int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(500, 500); glutCreateWindow(""); glutDisplayFunc(&myDisplay); glutMainLoop(); return 0; } ``` 这是运行结果图: ![第一个OpenGL程序](https://pic.biss.click/image/0ef5fbe7-0338-4cd0-94c7-1874273461f7.png) # 代码解释 这段代码展示了经典的 OpenGL (GLUT) 固定渲染管线基本操作。为了方便理解,我将这些函数按照 **初始化与窗口管理**、**状态设置**、**坐标变换** 以及 **图形绘制** 四个类别进行了整理。 ## 1. 窗口管理与初始化 (GLUT 库) 这类函数主要用于配置窗口系统和处理程序的运行流程。 | 函数名称 | 功能描述 | 核心参数说明 | | :--- | :--- | :--- | | `glutInit` | 初始化 GLUT 库 | 接收 `main` 函数的命令行参数 | | `glutInitDisplayMode` | 设置显示模式 | `GLUT_RGB` (使用颜色模式), `GLUT_SINGLE` (单缓冲区) | | `glutInitWindowPosition` | 设置窗口在屏幕上的初始位置 | 窗口左上角坐标 $(x, y)$ | | `glutInitWindowSize` | 设置窗口的宽度和高度 | 像素值 (Width, Height) | | `glutCreateWindow` | 创建窗口 | 字符串参数作为窗口标题 | | `glutDisplayFunc` | 注册显示回调函数 | 传入负责绘图的函数指针 | | `glutMainLoop` | 进入 GLUT 事件处理循环 | 让程序持续运行,等待重绘或交互 | --- ## 2. 状态设置与缓冲区操作 这些函数用于配置 OpenGL 的全局状态(如颜色、点大小)或清理画布。 | 函数名称 | 功能描述 | 核心参数说明 | | :--- | :--- | :--- | | `glClearColor` | 设置清除颜色(背景色) | RGBA 值 (0.0~1.0),此处设为黑色 | | `glClear` | 清除指定的缓冲区 | `GL_COLOR_BUFFER_BIT` 表示清除颜色缓存 | | `glColor4f` | 设置当前的绘制颜色 (带透明度) | RGBA 分量 | | `glColor3f` | 设置当前的绘制颜色 (不带透明度) | RGB 分量 | | `glPointSize` | 设置点的像素大小 | 浮点数,数值越大点越粗 | | `glFlush` | 强制刷新缓冲区 | 确保绘图命令立即执行并输出到显示设备 | --- ## 3. 矩阵与坐标变换 用于定义物体是如何投影到屏幕上的。 | 函数名称 | 功能描述 | 核心参数说明 | | :--- | :--- | :--- | | `glMatrixMode` | 设置当前矩阵模式 | `GL_PROJECTION` 切换到投影矩阵堆栈 | | `gluOrtho2D` | 定义二维正交投影裁剪区域 | 定义视野的左、右、下、上边界范围 | --- ## 4. 几何图形绘制 OpenGL 的核心绘图逻辑,通过指定顶点来构建形状。 | 函数名称 | 功能描述 | 核心参数说明 | | :--- | :--- | :--- | | `glRectf` | 绘制一个实心矩形 | 传入左下角坐标和右上角坐标 $(x1, y1, x2, y2)$ | | `glBegin` | 标记图元绘制的开始 | `GL_LINES` (线), `GL_POINTS` (点), `GL_TRIANGLES` (三角形) | | `glVertex2f` | 指定一个二维顶点 (浮点型) | 坐标 $(x, y)$ | | `glVertex2i` | 指定一个二维顶点 (整型) | 坐标 $(x, y)$ | | `glEnd` | 标记图元绘制的结束 | 必须与 `glBegin` 成对出现 | ---