歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

【OpenGL4.0】GLSL渲染語言入門與VBO、VAO使用:繪制一個三角形

以前都是用Cg的,現在改用GLSL,又要重新學,不過兩種語言很多都是相通的。

下面的例子是實現繪制一個三角形的簡單程序。采用了VBO(veretx buffer object)、VAO(vertex array object)等OpenGL的一些新特性。越往後發展,可編程管線肯定是大勢所趨,OpenGL裡原來的一些固定管線的內容肯定會被廢棄掉。所以從現在開始寫程序就要養成使用新特性、采用可編程管線技術的好習慣。

一、VAO、VBO介紹

隨著OpenGL狀態和固定管線模式的移除,我們不在用任何glEnable函數調用,而且也不會有glVertex、glColor等函數調用。這就意味著我們需要一種新的方式來將數據傳輸到圖形卡以渲染圖形。我們可以采用VBO,或者是在OpenGL3以上版本引入的新的特性,叫做VAO。通過它,我們可以把頂點數據和顏色存儲在不同的VBO中,但是在同一個VAO中。對於法線數據或者其他的頂點信息也是一樣。

VAO,是這樣一種方式:把對象信息直接存儲在圖形卡中,而不是在當我們需要的時候傳輸到圖形卡。這就是Direct3D所采用得方式,而在OpenGL中只有OpenGL3.X以上的版本中采用。這就意味著我們的應用程序不用將數據傳輸到圖形卡或者是從圖形卡輸出,這樣也就獲得了額外的性能提升。

使用VAO並不難。我們不需要大量的glVertex調用,而是把頂點數據存儲在數組中,然後放進VBO,最後在VAO中存儲相關的狀態。記住:VAO中並沒有存儲頂點的相關屬性數據。OpenGL會在後台為我們完成其他的功能。

OpenGL編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm

-------------------------------------分割線-------------------------------------

OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm

Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm

OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm

Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm

如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm

《OpenGL超級寶典》學習筆記 http://www.linuxidc.com/Linux/2013-10/91414.htm

-------------------------------------分割線-------------------------------------

使用VAO的步驟

1、產生VAO

void glGenVertexArrays(GLsizei n,

    GLuint *arrays);

n:要產生的VAO對象的數量。

arrays:存放產生的VAO對象的名稱。

2、綁定VAO

void glBindVertexArray(GLuint array);

array:要綁定的頂點數組的名字。

3、產生VBOs

void glGenBuffers(GLsizei 

 n,

    GLuint *    buffers);

產生緩沖區對象的名稱。

參數含義和glGenVertexArrays類似。

4、綁定VBOs

void glBindBuffer(GLenum 

 target,

    GLuint    buffer);

綁定一個緩沖區對象。

target可能取值是:GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, or GL_PIXEL_UNPACK_BUFFER.

當進行綁定之後,以前的綁定就失效了。

5、給VBO分配數據:

void glBufferData(  GLenum          target,

GLsizeiptr      size,

const GLvoid *        data,

GLenum          usage);

target可能取值為:GL_ARRAY_BUFFER(表示頂點數據), GL_ELEMENT_ARRAY_BUFFER(表示索引數據),GL_PIXEL_PACK_BUFFER(表示從OpenGL獲取的的像素數據), or GL_PIXEL_UNPACK_BUFFER(表示傳遞給OpenGL的像素數據).

參數含義:

size:緩沖區對象字節數

data:指針:指向用於拷貝到緩沖區對象的數據。或者是NULL,表示暫時不分配數據。

6、定義存放頂點屬性數據的數組:

首先需要啟用VAO中對應的頂點屬性數組:

void glEnableVertexAttribArray(      GLuint    index);

index:指定了需要啟用的頂點屬性數組的索引

注意:它只在OpenGL2.0及其以上版本才有。

7、給對應的頂點屬性數組指定數據:

void glVertexAttribPointer(      GLuint    index,

GLint      size,

GLenum          type,

GLboolean    normalized,

GLsizei  stride,

const GLvoid *        pointer);

index:要指定數據的頂點屬性數組的索引。

size:每個頂點屬性的數據個數。可能的取值是1、2、3或者4.初始值是4.

type:數組中每個數據的類型。可能的取值是:GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT, or GL_DOUBLE。初始值是GL_FLOAT。

normalized:指定頂點數在被訪問的時候是否需要被歸一化。

注意:如果有個非零的緩沖對象綁定到GL_ARRAY_BUFFER,那麼pointer就是對應的緩沖區對象的偏移量。

stride:兩個連續頂點的屬性之間的偏移量。

pointer:指向數組中的第一個頂點屬性的第一個數據。

8、然後在進行渲染的時候,只需要綁定對應的VAO即可,操作起來十分方便。

glBindVertexArray(vaoHandle);

 9、使用完畢之後需要清除綁定。

glBindVertexArray(0);

事實上,在這個簡單的程序中,不用VAO,只用VBO也一樣可以實現。只是采用VAO可以進一步提升性能,而且在較新版本的OpenGL中不用VAO的方式會被逐漸廢棄。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104852p2.htm

Copyright © Linux教程網 All Rights Reserved