OpenGL 幾何圖元繪製基礎:點、線、多邊形的概念差異、頂點指定函數族、glBegin/glEnd 繪製模式、三個完整示例(圓、五角星、正弦曲線)。
| 數學概念 | OpenGL 實現 |
|---|---|
| 點:無大小位置 | 單像素,可多點同像素 |
| 線:無寬無限長 | 有寬有限線段,兩端點確定 |
| 多邊形:閉合區域 | 凸多邊形,頂點確定,非凸結果未定義 |
glVertex*glVertex2i(1, 3); // 2D 整數
glVertex2f(1.0f, 3.0f); // 2D 浮點
glVertex3f(1.0f, 3.0f, 0); // 3D
glVertex4f(1.0f, 3.0f, 0, 1); // 齊次坐標
GLfloat v[] = {1,3,0};
glVertex3fv(v); // 指針版
後綴含義:2/3/4 參數數,i/f/d/s 類型,v 指釖數組。
glBegin(mode)| 模式 | 說明 | 頂點數/圖元 |
|---|---|---|
| GL_POINTS | 孤立點 | 1 |
| GL_LINES | 獨立線段 | 2 |
| GL_LINE_STRIP | 連續折線 | n+1 頂點 → n 段 |
| GL_LINE_LOOP | 閉合折線 | n 頂點 → n 段 |
| GL_TRIANGLES | 獨立三角形 | 3 |
| GL_TRIANGLE_STRIP | 三角條帶 | n 頂點 → n-2 形 |
| GL_TRIANGLE_FAN | 三角扇 | n 頂點 → n-2 形 |
| GL_QUADS | 獨立四邊形 | 4 |
| GL_POLYGON | 凸多邊形 | n |
#include <GL/glut.h> // 需 _USE_MATH_DEFINES 獲取 M_PI
#define N 20
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
for (int i = 0; i < N; i++) {
double angle = 2 * M_PI * i / N;
glVertex2d(0.5 * cos(angle), 0.5 * sin(angle));
}
glEnd();
glFlush();
}
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(500, 500);
glutCreateWindow("Circle");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
void display() {
GLfloat a = 0.5f;
GLfloat p72 = M_PI * 72 / 180, p36 = M_PI * 36 / 180;
GLfloat A[2] = {-a*sin(p72), a*cos(p72)};
GLfloat B[2] = {0, a};
GLfloat C[2] = {a*sin(p72), a*cos(p72)};
GLfloat D[2] = {a*sin(p36), -a*cos(p36)};
GLfloat E[2] = {-a*sin(p36), -a*cos(p36)};
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
glVertex2fv(A); glVertex2fv(C); glVertex2fv(E);
glVertex2fv(B); glVertex2fv(D);
glEnd();
glFlush();
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
// 坐標軸
glBegin(GL_LINES);
glVertex2f(-1, 0); glVertex2f(1, 0);
glVertex2f(0, 1); glVertex2f(0, -1);
glEnd();
// 正弦曲線
glBegin(GL_LINE_STRIP);
for (float x = -10; x < 10; x += 0.01f) {
glVertex2f(x/10, sinf(x)/10);
}
glEnd();
glFlush();
}
文中使用 static void display() 避免多文件同名衝突,便於單項目多 main 測試。