1,查看當(dāng)前opengl版本
2,glew
the OpenGL Extension Wrangler Library. GLEW helps you deal with the headache that can accompany the management of extensions in OpenGL. Once initialized it queries for all the available extensions on your platform, dynamically loads them and provides easy access via a single header file.
If you include other OpenGL headers you must be careful to include this file before the others else GLEW will complain that about it.
3,
GL_ARB_vertex_buffer_object 擴(kuò)展致力于提供頂點(diǎn)數(shù)組與顯示列表的優(yōu)勢(shì)來提升OpenGL效率,同時(shí)避免它們實(shí)現(xiàn)上的不足。
頂點(diǎn)緩存對(duì)象(VBO)準(zhǔn)許頂點(diǎn)數(shù)組數(shù)據(jù)存放在服務(wù)端的高性能顯卡內(nèi)存中,且提供高效數(shù)據(jù)傳輸。如果緩存對(duì)象用于保存像素?cái)?shù)據(jù),就被稱為像素緩存對(duì)象(PBO)。
使用頂點(diǎn)數(shù)組可以降低函數(shù)調(diào)用次數(shù)與降低共享頂點(diǎn)的重復(fù)使用。
可以在多個(gè)客戶端共享緩存數(shù)據(jù)。因?yàn)閂BO處在服務(wù)器端,多個(gè)客戶端可以通過相應(yīng)的標(biāo)示符訪問同一個(gè)緩存。
4,創(chuàng)建VBO需要3個(gè)步驟:
使用glGenBuffers()生成新緩存對(duì)象。
使用glBindBuffer()將緩存對(duì)象連接到相應(yīng)的緩存上。
使用glBufferData()將頂點(diǎn)數(shù)據(jù)拷貝到緩存對(duì)象中。
void glGenBuffers(GLsizei n, GLuint* buffers);
void glBindBuffer(GLenum target, GLuint buffer);
void glBufferData(GLenum target,GLsizeiptr size, const GLvoid* data, GLenum usage);
void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
與glBufferData()類似,glBufferSubData()用于向VBO中拷貝數(shù)據(jù),不過它僅僅將從給定offset開始的一定范圍的數(shù)據(jù)替換到現(xiàn)存緩存中。(在使用glBufferSubData()之前,整個(gè)緩存必須由glBufferData()指定。)
void glDeleteBuffers(GLsizei n, const GLenum* bufs);
glEnableVertexAttribArray(0);
加載到buffer中的頂點(diǎn)位置在固定功能管線中是被認(rèn)為是索引為0的頂點(diǎn)屬性(當(dāng)沒有著色器綁定時(shí)被啟用)。
必須開啟每一個(gè)頂點(diǎn)的屬性,否則渲染管線無法獲取這些數(shù)據(jù)。
glBindBuffer(GL_ARRAY_BUFFER, VBO);
這里我們?cè)俅谓壎ㄎ覀兊腷uffer準(zhǔn)備開始draw call回調(diào)。
在這個(gè)小程序中我們每一幀都調(diào)用這個(gè)回調(diào)是很冗余的,在更加復(fù)雜的程序中,將會(huì)有很多的buffer緩沖來存儲(chǔ)不同的模型,則需要Bind要調(diào)用的Buffer來不斷更新管線的狀態(tài)。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
這個(gè)回調(diào)告訴管線怎樣解析bufer中的數(shù)據(jù)。
第1個(gè)參定義了屬性的索引,再這個(gè)例子中我們知道這個(gè)索引默認(rèn)是0,但是當(dāng)我們開始使用shader著色器的時(shí)候,我們既要明確的設(shè)置著色器中的屬性索引同時(shí)也要檢索它;
第2個(gè)參數(shù)指的是屬性中的元素個(gè)數(shù)(3個(gè)表示的是:X,Y,Z坐標(biāo));
第3個(gè)參數(shù)指的是每個(gè)元素的數(shù)據(jù)類型;
第4個(gè)參數(shù)指明我們是否想讓我們的屬性在被管線使用之前被單位化,我們這個(gè)例子中希望我們的數(shù)據(jù)保持不變的被傳送;
第5個(gè)參數(shù)(稱作'stride')指的是緩沖中那個(gè)屬性的兩個(gè)實(shí)例之間的比特?cái)?shù)距離。當(dāng)只有一個(gè)屬性(例如:buffer只含有一個(gè)頂點(diǎn)的位置數(shù)據(jù))并且數(shù)據(jù)被緊密排布的時(shí)候?qū)⒃搮?shù)值設(shè)置為0。如果我們有一個(gè)包含位置和法向量(都是有三個(gè)浮點(diǎn)數(shù)的vector向量,一共6個(gè)浮點(diǎn)數(shù))兩個(gè)屬性的數(shù)據(jù)結(jié)構(gòu)的數(shù)組的時(shí)候,我們將設(shè)置參數(shù)值為這個(gè)數(shù)據(jù)結(jié)構(gòu)的比特大小(6*4=24);
最后一個(gè)參數(shù)在前一個(gè)例子中非常有用。我們需要在管線發(fā)現(xiàn)我們的屬性的地方定義數(shù)據(jù)結(jié)構(gòu)中的內(nèi)存偏移值。在有位置數(shù)據(jù)和法向量數(shù)據(jù)的結(jié)構(gòu)中,位置的偏移量為0,而法向量的偏移量則為12。
5,
可見的點(diǎn)必須在這個(gè)盒子內(nèi),這樣他們將可以通過視窗的變換映射到窗口中可見的坐標(biāo)上。當(dāng)俯視Z坐標(biāo)軸的負(fù)方向時(shí)這個(gè)單位化盒子看上去如下圖: