首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

OpenGL 基礎學習(二):點、線、多邊形繪製與頂點指定詳解

     編輯:關於C語言

OpenGL 基礎學習(二):點、線、多邊形繪製與頂點指定詳解

OpenGL 幾何圖元繪製基礎:點、線、多邊形的概念差異、頂點指定函數族、glBegin/glEnd 繪製模式、三個完整示例(圓、五角星、正弦曲線)。

一、OpenGL 中的幾何概念

數學概念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

四、示例 1:繪製圓(參數方程 + GL_POLYGON)

#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;
}

五、示例 2:繪製五角星(幾何計算 + GL_LINE_LOOP)

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();
}

六、示例 3:繪製正弦曲線

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 函數技巧

文中使用 static void display() 避免多文件同名衝突,便於單項目多 main 測試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved