1. 程式人生 > >OpenGL頂點陣列

OpenGL頂點陣列

繪製幾何物件
1、指定幾何物件
:向OpenGL傳送資料有三種方式:1、“一次一個頂點” glBegin();  2、 頂點陣列方式;3、顯示列表方式。
2、逐個頂點操作:逐個但無論使用哪一種方式,最後結果都是將幾何資料傳輸到OpenGL中的第一個處理階段,即"頂點處理"。在這個階段,頂點位置會通過模型矩陣和投影矩陣來轉化,法線會通過從模型矩陣獲得的左上角的3x3矩陣的逆變換來轉化,紋理座標會通過紋理矩陣來轉化。因為在這個階段中發生的最要的事情就是轉換和光照,所以頂點處理階段有時也叫做“轉換和光照”。
3、圖元組裝:處理完頂點之後,與各個頂點相關聯的全部屬性就會得到完全的確定,頂點資料接著就會被髮送到一個名為“圖元組裝”的階段,在這個階段頂點資料被結合成圖元,如點、線、三角形、四邊形和多邊形。
4、圖元處理

:這個階段第一個發生的步驟是裁剪,這個操作將各個圖元與使用者定義的裁剪平面(使用glClipPlane來設定)以及模型矩陣和投影矩陣建立的視景體來做比較。如果圖元完全位於視景體以及使用者定義的裁剪平面內部,則傳遞圖元以進行後面的處理。如果在外部,則丟棄圖元,無需再做進一步的處理。在這個階段的另一個操作是透視投影,首先將各定點座標x, y, z除以齊次座標w,然後將由當前的視口變換來轉換各個頂點,以生成視窗座標。可以設定某些OpenGL狀態,對圖元執行“消隱操作”。使用計算好的視窗座標來測試各個多邊形圖元,可以檢視它是否遠離當前的檢視位置,呼叫glEnable啟動消隱狀態,呼叫glCullFace指定將要丟棄背面多邊形、正面多邊形還是二者都丟棄。

當我們人為的繪製形狀時,首先想到是是座標點,而不是api,如要繪製一條直線,首先將兩個點的座標存在一起,則更加容易理解,OpenGL的頂點陣列就是這樣的作用.

首先來回顧下之前畫直線的函式

示例1

void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2)
{
   glBegin(GL_LINES);
   glVertex2f ((x1),(y1)); 
   glVertex2f ((x2),(y2));
   glEnd();
}

需要呼叫兩次glVertex2f ,並且輸入兩個頂點,現在我們來看另一種做法

將座標存在一個數組中

示例2

void drawLineWithArray()
{
    GLint vertices[]={25,25,
                      100,100};
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2,GL_INT,0,vertices);
    glBegin(GL_LINES);
    glArrayElement(0);
    glArrayElement(1);
    glEnd();

}

vertices記錄了兩個座標(x1,y1)=(25,25),(x2,y2)=(100,100) 
但是其索引值卻是0,1,2,3.為了識別一個座標點,需要一個函式將陣列進行切分. 
glVertexPointer則用於這個功能,可以稱這種陣列為混合陣列,引數指定了頂點陣列的配對點(如座標定位為2個,顏色則為3個),資料型別及陣列 
注意:在使用頂點陣列時,必須先呼叫glEnableClientState開啟頂點陣列功能,在不用的時候呼叫glDisableClientState來禁用

glArrayElement則根據頂點陣列來呼叫相應的函式,每次只調用1個頂點

示例2和示例1的效果是相同,初看好像並沒有變簡單,反而變複雜了.

啟用多個頂點陣列

除了指定頂點的座標陣列外,還可以啟動顏色,表面法線等其他頂點陣列

下面以不同顏色畫兩條直線 
示例3

void drawTwoLineWithArray()
{
    GLint vertices[]={25,25,
                      100,100,
                      120,120,
                      200,200};
    GLfloat colors[]={1.0, 0.0, 0.0,
                      1.0, 0.0, 0.0,
                      0.0, 1.0, 0.0,
                      0.0, 1.0, 0.0};
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glVertexPointer(2,GL_INT,0,vertices);
    glColorPointer(3,GL_FLOAT,0,colors);
    glBegin(GL_LINES);
    glArrayElement(0);
    glArrayElement(1);
    glArrayElement(2);
    glArrayElement(3);
    glEnd();
}

注意:每開啟一種頂點陣列都必須呼叫glEnableClientState來啟用

效果如下

image

跨距

如上示例3,有一個座標陣列和顏色陣列,如果將兩個數組合並在一起,那麼座標和顏色的資料就在一個數組了,現在程式碼修改如下

示例4

GLfloat data[]=  {1.0, 0.0, 0.0,25.0,25.0,
                  1.0, 0.0, 0.0,100.0,100.0,
                  0.0, 1.0, 0.0,120.0,120.0,
                  0.0, 1.0, 0.0,200.0,200.0};

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3,GL_FLOAT,5*sizeof(GLfloat),&data[0]);
glVertexPointer(2,GL_FLOAT,5*sizeof(GLfloat),&data[3]);

第3個引數指定跨距,如顏色,從陣列的每組資料的第1個開始取資料,然後跨5個,座標頂點則從資料每組資料的第4個開始取資料並跨5個 
注意:由於跨距需要計算資料型別,所以陣列的資料型別需要相同

以上程式碼效果是相同的

解引用頂點陣列列表

1.其提供了一個glDrawElements函式用於迴圈呼叫glArrayElement,但需要定義一個索引的陣列

示例5

void drawTwoLineWithArray2()
{
    GLfloat data[]=  {1.0, 0.0, 0.0,25.0,25.0,
                      1.0, 0.0, 0.0,100.0,100.0,
                      0.0, 1.0, 0.0,120.0,120.0,
                      0.0, 1.0, 0.0,200.0,200.0};
    GLubyte index[]= {0,1,2,3} ;
    

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(3,GL_FLOAT,5*sizeof(GLfloat),&data[0]);
    glVertexPointer(2,GL_FLOAT,5*sizeof(GLfloat),&data[3]);
    
    glDrawElements(GL_LINES,4,GL_UNSIGNED_BYTE,index);
    
}

2.從索引項開始

glDrawArrays(GL_LINES,0,4);

這個函式更加簡單,直接從第0個開始訪問4個元素

在頂點比較多的情況下,頂點陣列應該是很有用的一個功能

混合陣列

以下是最簡化的操作

glInterleavedArrays函式將會根據引數,啟用各種頂點陣列,並存儲頂點,如下

void drawTwoLineWithArray3()
{
    GLfloat data[]=  {1.0, 0.0, 0.0,25.0,25.0,0.0,
                      1.0, 0.0, 0.0,100.0,100.0,0.0,
                      0.0, 1.0, 0.0,120.0,120.0,0.0,
                      0.0, 1.0, 0.0,200.0,200.0,0.0};
    
    
    glInterleavedArrays(GL_C3F_V3F,0,data);
    glDrawArrays(GL_LINES,0,4);
    
}
效果是相同的 
現在去掉顏色的陣列的話,程式碼如下 
GLfloat data[]=  {25.0,25.0,
                  100.0,100.0,
                  120.0,120.0,
                  200.0,200.0};
glInterleavedArrays(GL_V2F,0,data);
glDrawArrays(GL_LINES,0,4);
上述程式碼可看性就比較高了

相關推薦

OpenGL--頂點陣列與緩衝區中使用頂點陣列

理論基礎 頂點陣列:就是把一些頂點資料儲存到陣列中儲存,這些資料包括:頂點座標,表面法線,RGBA顏色,輔助顏色,顏色索引,霧座標,紋理座標以及多邊形的邊界標誌。這樣就可以只通過一個函式呼叫來完成繪製,大大減少了函式的呼叫次數,同時還可以避免共享頂點的冗餘處

opengl 頂點陣列 學習筆記

首先我們先來了解一下什麼頂點陣列。顧名思義頂點陣列就是存放頂點資料的陣列,那麼頂點陣列的作用是什麼?舉一個例子:有一張員工薪水錶,要求你把薪水5000元以上員工的姓名的挑選出來,我相信你會把符合條件的員工的姓名挑選出來,再在後面標明"以上是員工薪水5000元以上名單",而不是在每一個符合條件的員工姓名後面加"

OpenGL頂點陣列

繪製幾何物件 1、指定幾何物件:向OpenGL傳送資料有三種方式:1、“一次一個頂點” glBegin();  2、 頂點陣列方式;3、顯示列表方式。2、逐個頂點操作:逐個但無論使用哪一種方式,最後結果都是將幾何資料傳輸到OpenGL中的第一個處理階段,即"頂點處理"。

android平臺下OpenGL ES 3.0例項詳解頂點屬性、頂點陣列

OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

android平臺下OpenGL ES 3.0例項詳解頂點緩衝區物件(VBO)和頂點陣列物件(VAO)

OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

OpenGL入門(三)頂點陣列

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

OpenGL ES中的頂點陣列頂點屬性、緩衝區物件

什麼是頂點資料? 在計算機中圖元的位置是通過x,y,z,w來儲存或顏色資料是通過RGBA的陣列格式儲存的,然後通過多個點來進行圖元裝配和光柵化出圖形.比如三角形3個點使用X,Y,Z表示如下: GLfloat vertex[]={ 0.0f,1

OpenGL狀態管理和繪製幾何物體之頂點陣列

1. 頂點陣列可以減少函式呼叫次數, 還可以避免冗餘資料 2. 使用頂點陣列對幾何圖形進行渲染需要3個步驟 a. 啟用最多可達8個數組,每個陣列用於儲存不同型別的資料:頂點座標,表面法線,RGBA顏色,輔助顏色,顏色索引,霧座標,紋理座標以及多邊形的邊界標誌 b. 把

OpenGL ES 3.0程式設計指南學習筆記 第6章 頂點屬性、頂點陣列和緩衝區物件

1)vec2等為float型,也就是著色語言預設為float操作。float,vec2,vec3,vec4 2)矩陣以列優先順序儲存,也就是說矩陣可以看做是由幾個列向量組成,例如;mat3 myMat3 = mat3(1.0, 0.0, 0.0,//First column

OpenGL加速渲染:頂點陣列的索引模式

         使用頂點陣列時,往往要將所有需要使用的頂點放入陣列中,以便於統一呼叫。         比如一條折線:GLfloat vPoints[] = { 0.0, 0.0, 0.0, //折線端點0 1.0, 0.0, 0.0, //折線端點1

OpenGL ES】頂點緩衝區物件VBO與頂點陣列物件VAO

頂點屬性即頂點資料,可以通過頂點陣列逐頂點指定,也可以為所有頂點指定一個常量,所有OpenGL ES 3.0實現必須支援至少16個頂點屬性,應用程式可以通過glGetIntegerv查詢GL_MAX_VERTEX_ATTRIBS得到支援的最大定點屬性個數。

OSG使用OpenGL頂點著色器和片元著色器

目的: 使用OpenGL著色語言中的頂點和片元著色器,替代原有的固化函式管道的光照和材質計算,用於場景圖形中的節點選擇。(磚塊著色器程式來自3DLabs) ------------------------------------ 概述: OpenGL著色語言允許程式設

openGL 頂點,座標系,紋理座標

瞭解座標系是繪製圖形的基礎。在使用openGL的場景中,有世界座標,區域性座標,紋理座標,和螢幕座標幾種。 openGL 座標系: 分3個軸,x,y,z 中心點為o, 箭頭方向為正方向,最大與最小值為1和-1,這是經過歸一化處理的。這樣設計是為了顯示卡計算方便。

Android OpenGL頂點及繪製基礎知識

上一次我講述了OpenGL的作用了,這次我使用了OpenGL來繪製一張桌子,其實我是將一個冰球桌拆分成幾塊來講述,現在就來繪製冰球桌的一些基本元素。在繪製的同時我順便來介紹下一些基礎知識。 一、OpenGL中頂點的作用 頂點:代表幾何物件的拐角的點,其中

opengl頂點資料傳送和著色器處理(vao,vbo)

OpenGL學習腳印: 頂點資料傳送和著色器處理1 寫在前面                本節內容翻譯和整理自《Learning Modern 3D Graphics Programming》Chapter1內容。作為學習目的,本文內容上不會完全遵從原文,有刪節。另外原文

OpenGL學習筆記-頂點輸入

創建 oat ati 數量 class rda sign 學習筆記 不同 1.構造頂點數據,以三角形為例子,float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; 2.構

3D Computer Grapihcs Using OpenGL - 19 Vertex Array Object(頂點數組對象)

mvp moved body 體重 transform mode 創建 unsigned ray 大部分OpenGL教程都會在一開始就講解VAO,但是該教程的作者認為這是很不合理的,因為要理解它的作用需要建立在我們此前學過的知識基礎上。因此直到教程已經進行了一大半,作者才引

OpenGL改變三角形的頂點顏色

在下面這一篇文章的基礎上進行修改 OpenGL建立一個帶顏色的矩形https://blog.csdn.net/qq_15267341/article/details/83476125      main.cpp #define GLEW_STAT

Learn OpenGL(二)——頂點輸入(Vertex Input)

      開始繪製一些東西之前, 我們必須給OpenGL輸入一些頂點資料。 OpenGL是一個3D圖形庫,所以我們在OpenGL中指定的所有座標都是在3D座標裡(x、 y和z)。 OpenGL不是簡單的把你所有的3D座標變換為你螢幕上的2D畫素; OpenGL只是在當它們的

Learn OpenGL(三)——頂點著色器(Vertext Shader)

        頂點著色器是幾個著色器中的一個, 它是可程式設計的。 現代OpenGL需要我們至少設定一個頂點著色器和一個片段著色器, 如果我們打算做渲染的話。 我們會簡要介紹一下著色器以及配置兩個非常簡單的著色器來繪製我們第一個三角形。          我們需要做的第一件