CG with OpenGL

更新:现在都用核心模式了,推荐LearnOpenGL,不推荐往下看啦。


OpenGL

OpenGL系统由独立于设备的函数集(核心库)、实用库(GLU)和实用工具包(GLUT)三部分组成。

二维几何变换

搬砖

码农之路不可长远

glut模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <GL/glut.h>

void someDrawing() {
glClear(GL_COLOR_BUFFER_BIT); // 显示背景色

glColor3f(0.0, 0.4, 0.2); // 设置颜色为绿色

// 画线
glBegin(GL_LINES);
glVertex2i(180, 15); // (180, 15) --- (10, 145)
glVertex2i(10, 145);
glEnd();

glFlush(); // 立即处理OpenGL常规事务
}

int main(int argc, char** argv) {
glutInit(&argc, argv);

// 使用单缓存,且使用RGB模式
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

// 距离左边界50像素,距离上边界100像素
glutInitWindowPosition(50, 100);

// 宽度400像素,高度300像素
glutInitWindowSize(400,300);

glutCreateWindow("Window Title");

// 背景缓存色为白色,Alpha值(调和参数)为0
glClearColor(1.0, 1.0, 1.0, 0.0);

// 设置正投影模式,将世界坐标系二维矩形区域内的内容映射到屏幕上
// x坐标为[0, 200],y坐标为[0, 150]。此范围外的内容不予显示
// 纵横比与窗口保持一致,使图形不变形
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // 排除之前投影矩阵的影响
gluOrtho2D(0.0, 200.0, 0.0, 150.0);

glutDisplayFunc(someDrawing); // 注册绘图函数
glutMainLoop(); // 进入主循环:显示所有东西然后等待

return 0;
}

主动错误检查

OpenGL记录一个全局错误标志,表示最近一个未被程序员抓取的错误信息。推荐在每一个显示回调子程序中至少检查一次出错情况:

1
2
3
4
5
6
7
8
GLenum errorCheck() {
const GLenum code = glGetError();
if (code != GL_NO_ERROR) {
const GLubyte* what = gluErrorString(code); // 静态常量内存
fprintf(stderr, "OpenGL error: %s\n", what);
}
return code;
}

画点与画线

函数后缀:int->i,short->s,float->f,double->d,vector->v,2D->2,3D->3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int p1[] = {75, 150};

glBegin(GL_POINTS); // 点
glVertex2iv(p1);
glVertex2i(50, 100);
glEnd();

glBegin(GL_LINES); // 两个点构成线
glVertex2iv(p);
glVertex2i(50, 100);// 成线
glVertex2iv(p3);
glVertex2iv(p4); // 成线
glVertex2iv(p5); // 被忽略
glEnd();

glBegin(GL_LINE_STRIP); // 普通折线
glVertex2iv(p1);
glVertex2i(50, 100);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();

glBegin(GL_LINE_LOOP); // 封闭折线
glVertex2iv(p1); // p1与p5成线
glVertex2i(50, 100);
glVertex2iv(p3);
glVertex2iv(p4);
glVertex2iv(p5);
glEnd();

有关OpenGL的出错编码请自行查找资料。