2011-04-29 37 views
3

我正在嘗試使用OpenGL 3.x +繪製背景(2D)的四邊形。四邊形已棄用,因此我們的目標是使用兩個三角形制作一個填充屏幕的矩形。它在工作,但我在這裏的一切都不是100%清楚。瞭解使用三角形在OpenGL 3.3+核心中繪製四邊形的代碼

  1. 設置

    GLuint positionBufferObject; 
    GLfloat vertexPositions[] = 
    { 
        -1.0f, -1.0f, 0.0f, 1.0f, 
        -1.0f, 1.0f, 0.0f, 1.0f, 
        1.0f, 1.0f, 0.0f, 1.0f, 
        1.0f, -1.0f, 0.0f, 1.0f, 
        -1.0f, -1.0f, 0.0f, 1.0f, 
    }; 
    glGenBuffers(1, &positionBufferObject); 
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW); 
    
    • 我明白vertexPositions,它的頂點數組。
    • glGenBuffers()是說,我想要1個緩衝區並分配ID到&positionBufferObject
    • glBufferData()vertexPositions上傳到GPU的內存;但是它怎麼知道要上傳它,因爲我沒有給它一個ID?
  2. 繪製

    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 5); 
    glDisableVertexAttribArray(0); 
    
    • glEnableVertexAttribArray()只是說我要與陣列0被畫什麼?
    • glDrawArrays() - 如果我想繪製兩個頂點數組呢?它如何知道要呈現哪些內容?它知道從上面的命令?
    • 不確定glVertexAttribPointer()是做什麼用的?
    • glDrawArrays()很清楚。
  3. 清理,我認爲這是正確的?

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glDeleteBuffers(1, &positionBufferObject); 
    

    我只做一次安裝/清理。

加分點:

  • 這是使這個最有效的方法是什麼?我知道我想提交併正在「批處理」中渲染[?],因爲3.x +不再立即執行模式。也只有一個數組,因此批處理在這種情況下無法提高性能,但是如果我說要繪製「非常多」的vertxArrays,它會是相同的過程嗎?
  • 在安裝程序中,它們將數組id存儲爲positionBufferObject,但在渲染循環中對其進行了硬編碼。似乎它會在十幾個數組後出現混淆,爲什麼使用變量而不是硬編碼是不好的做法呢?
+0

而不是一個四邊形,你可以使用一個三角形風扇,在只發送4個頂點的情況下,其行爲幾乎完全像四邊形。您可以glPrimitiveRestartIndex將多個三角形風扇放入單個glDrawElements調用中。 – datenwolf 2011-04-29 07:53:56

回答

7

glGenBuffers(1, &positionBufferObject);說「做一個頂點緩衝對象,而positionBufferObject是它的ID」。

glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);說「positionBufferObject現在是當前GL_ARRAY_BUFFER」。

glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);說「上傳vertexPositions到當前綁定到GL_ARRAY_BUFFER(這是positionBufferObject)的ID」。

glEnableVertexAttribArray(0);表示「頂點屬性數組0現在可供使用。「

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);說‘頂點屬性陣列0是被解釋爲包括4個浮點基團。’

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);說‘從每一個啓用陣列繪製具有五個索引三角形帶’。

glDisableVertexAttribArray(0);

+0

謝謝。 1)你如何處理多個GL_ARRAY_BUFFER? 2)glVertexAttribPointer基本上是說「如何」使用數組及其格式? – user697111 2011-04-29 02:52:41

+1

1)我不是一個足夠專家來回答這個問題:) 2)是的;例如,如果您的位置和顏色是交錯的,而不是處於不同的連續塊中,則您的「glVertexAttribPointer」調用將會有所不同。 3)在每次顯示更新時調用它。 – dfan 2011-04-29 02:56:04

+1

@ user697111對於1)glDrawArrays將使用任何一個VBO當前綁定,所以如果你想從第二個VBO繪製,只需調用glBindBuffer與第二個VBO的ID並再次調用glDrawArrays。 – 2011-04-29 05:09:38

3

在回答user697111的有關多個陣列的問題,「我們正在與頂點屬性陣列0時正在做」,這是相當簡單的。

每個頂點屬性都需要與一個緩衝區對象關聯。而不是用glVertexAttribPointer指定緩衝區對象,通過GL_ARRAY_BUFFER完成關聯。當您調用glVertexAttribPointer(或任何gl *指針調用)時,綁定到GL_ARRAY_BUFFER的當前的緩衝區將用作該屬性的源。因此,考慮以下因素:

glBindBuffer(GL_ARRAY_BUFFER, myPositionData); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, ..., 0); 
glBindBuffer(GL_ARRAY_BUFFER, myColorData); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, ..., 0); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glDrawArrays(...); 

屬性0將來自於緩衝區對象myPositionData和屬性1將來自緩衝對象myColorData。在調用glDrawArrays之前,我沒有更改綁定到GL_ARRAY_BUFFER的事實,這些屬性的數據來​​自哪裏。