我正在嘗試使用OpenGL 3.x +繪製背景(2D)的四邊形。四邊形已棄用,因此我們的目標是使用兩個三角形制作一個填充屏幕的矩形。它在工作,但我在這裏的一切都不是100%清楚。瞭解使用三角形在OpenGL 3.3+核心中繪製四邊形的代碼
設置
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?
- 我明白
繪製
glEnableVertexAttribArray(0); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 5); glDisableVertexAttribArray(0);
glEnableVertexAttribArray()
只是說我要與陣列0被畫什麼?glDrawArrays()
- 如果我想繪製兩個頂點數組呢?它如何知道要呈現哪些內容?它知道從上面的命令?- 不確定
glVertexAttribPointer()
是做什麼用的? glDrawArrays()
很清楚。
清理,我認爲這是正確的?
glBindBuffer(GL_ARRAY_BUFFER, 0); glDeleteBuffers(1, &positionBufferObject);
我只做一次安裝/清理。
加分點:
- 這是使這個最有效的方法是什麼?我知道我想提交併正在「批處理」中渲染[?],因爲3.x +不再立即執行模式。也只有一個數組,因此批處理在這種情況下無法提高性能,但是如果我說要繪製「非常多」的vertxArrays,它會是相同的過程嗎?
- 在安裝程序中,它們將數組id存儲爲positionBufferObject,但在渲染循環中對其進行了硬編碼。似乎它會在十幾個數組後出現混淆,爲什麼使用變量而不是硬編碼是不好的做法呢?
而不是一個四邊形,你可以使用一個三角形風扇,在只發送4個頂點的情況下,其行爲幾乎完全像四邊形。您可以glPrimitiveRestartIndex將多個三角形風扇放入單個glDrawElements調用中。 – datenwolf 2011-04-29 07:53:56