Files
blog/source/_posts/2026/2026.4/opengl-1.md
biss 1dcc27108a
All checks were successful
自动部署 / deploy (push) Successful in 4m9s
20260411
2026-04-11 19:43:08 +08:00

131 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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<GL/glut.h>
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` 成对出现 |
---