1. 程式人生 > >OpenGL入門(三)頂點陣列

OpenGL入門(三)頂點陣列

寫在前面
最近對OpenGL程式設計又雙叒產生了濃厚的興趣,決定把學習OpenGL過程中學到的知識都整理到部落格中來,一來方便日後檢視,而來也是為了和諸位大佬共勉。有不當的地方還望諸位批評指正,謝謝。 
本系列部落格將使用freeglut3.0.0和glew2.1.0和vs2017,在win10平臺上開發。

包含glew
包含glew和包含freeglut一樣,在屬性裡包含include檔案和lib庫,此處不再多說。此外,需要在專案右鍵->屬性->連結器->輸入->附加依賴項中新增glew32.lib: 


繪製頂點
下面這段程式碼會在視窗中央繪製5個排在一行的頂點,需要注意的是(0,0,0)會被繪製到視窗中央:

// OpenGL3.cpp: 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <GL\glew.h>
#include <GL\freeglut.h>

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

GLfloat vertex[] = { 0.0, 0.0, 0.0,
                    0.05, 0.0, 0.0,
                    0.1, 0.0, 0.0,
                    0.15, 0.0, 0.0,
                    0.2, 0.0, 0.0,
                    0.25, 0.0, 0.0,
};

void init()
{
    glClearColor(1, 1, 1, 0.0);
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0, 0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT,GL_FALSE, 0, vertex);
    glDrawArrays(GL_POINTS, 0, 5);
    glDisableVertexAttribArray(0);
    glFlush();
}

int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(400, 300);
    glutCreateWindow("頂點");

    init();
    glutDisplayFunc(display);
    GLuint result = glewInit();
    if (result != GLEW_OK) {
        fprintf(stderr, "Error: '%s'\n", glewGetErrorString(result));
        return 1;
    }
    glutMainLoop();
    return 0;
}

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
46
47
48
49
50
51
52
53
效果如下: 


程式碼詳解
在OpenGL中,所有模型都可以看成是由若干個頂點構成,每個頂點有自己的空間座標、顏色座標、法線座標等。所以繪製圖形可以通過繪製頂點來完成。我們可以通過glVertex*()制定單個頂點,但在繪製多個頂點時,使用頂點資料陣列要快得多,也要方便得多。使用定點陣列要經過如下流程: 
 
此處我們使用glew來進行頂點陣列操作。首先在main函式中初始化glew:

GLuint result = glewInit();
if (result != GLEW_OK) {
    fprintf(stderr, "Error: '%s'\n", glewGetErrorString(result));
    return 1;
}
1
2
3
4
5
glewInit()會返回一個標識碼用來判斷初始化是否成功。如果失敗,可以用glewGetErrorString(GLenum error)獲取標識碼對應的錯誤資訊,用fprintf()將錯誤資訊寫入檔案。

之後,啟用頂點陣列:

glEnableVertexAttribArray(GLuint index);
1
OpenGL支援多個頂點陣列,index表示頂點陣列對應的下標。

之後制定頂點陣列資料和解引用格式:

glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer)
1
index:頂點陣列下標。
size:頂點維度,比如二維、三維、四維,只能是2、3、4。
type:頂點資料型別,比如整數、浮點數等。
normalized:是否對頂點進行單位化。
stride:跨距,指兩個頂點資料之間隔著多少個byte。比如我們在一個頂點陣列中既儲存了位置座標(x, y, z),也儲存了顏色座標(r, g, b):GLfloat vertex[] = {x1, y1,z1, r1, g1, b1, x2, y2, z2, c2, r2, g2, b2},這種情況下跨距指x1與x2之間的間隔,也就是sizeof(x1) * 6。
pointer:頂點資料陣列,儲存著頂點資料。
接著解引用頂點陣列:

glDrawArrays(GLenum mode, GLint first, GLsizei count);
1
mode:解引用模式,即最後生成圖形的模式,有頂點、點化線、線段、多邊形等。
first:陣列中要被繪製的第一個元素,我們可以選擇從陣列中第一個元素開始繪製,也可以選擇以後的元素作為開始解引用的首元素。
count:要繪製的頂點個數。
當我們不用頂點陣列時,可以選擇關閉它:

glDisableVertexAttribArray(GLuint index)
1
index表示頂點陣列下標。

結語
請了解本系列下一篇博文:OpenGL入門(四)頂點緩衝區

會這門技術的程式設計師遭瘋搶,年薪20萬還是白菜價!
各大公司目前急缺大資料人才,隨著技術與運用的成熟,應用集中於網際網路、金融、醫療、新能源、通訊和房地產等行業。


--------------------- 
作者:玉雪逐梅 
來源:CSDN 
原文:https://blog.csdn.net/renkai0406/article/details/80084761?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!