2014-03-05 44 views
2

在我的程序中,我基本上把所有的對象放在一個緩衝區中,現在我遇到問題時想繪製多個對象,如果我只畫一個它仍然有效。
當我大致將所有glDrawArrays調到glDrawElements調用時,以及當然所有的底層基礎架構發生時,問題開始發生。
截至目前,我只是做了一個一對一從頂點到索引的映射。DrawElements不能像預期的那樣與多個對象一起工作

我正在使用Java 8,LWJGL和OpenGL 3.3。

初始化:

//drawable vertex buffer 
vertexBuffer = new StaticDrawArrayBuffer().create().bind().fillData(Drawable.putAllVertexData(drawables)); 
vertexArray = new VertexArrayObject().create().bind() 
     .setAttribute(vertexBuffer, VS_POSITION, 3, GL_FLOAT, false, 0, 0) 
     .enableAttributes(VS_POSITION); 

//drawable elements buffer 
elementBuffer = new StaticDrawElementArrayBuffer().create().bind().fillData(Drawable.putAllElementsData(drawables)); 

所以我做到以下幾點:

  1. 創建ARRAY_BUFFER和所有的頂點數據存儲在那裏。
  2. 創建一個頂點數組對象,並設置可以找到position數據的位置。
  3. 創建一個ELEMENT_ARRAY_BUFFER並存儲所有索引。

內容如下;

頂點數據:

-400.0 
0.0 
-400.0 
-400.0 
0.0 
400.0 
400.0 
0.0 
-400.0 
-400.0 
0.0 
400.0 
400.0 
0.0 
-400.0 
400.0 
0.0 
400.0 
1.0 
1.0 
-1.0 
-1.0 
1.0 
-1.0 
-1.0 
1.0 
1.0 
-1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
-1.0 
1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
1.0 
-1.0 
-1.0 
1.0 
1.0 
-1.0 
1.0 
1.0 
-1.0 
-1.0 
-1.0 
1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
1.0 
-1.0 
-1.0 
1.0 
-1.0 
1.0 
1.0 
-1.0 
1.0 
-1.0 
-1.0 
1.0 
1.0 
-1.0 
-1.0 
1.0 
1.0 
-1.0 
1.0 
1.0 
-1.0 
1.0 
1.0 
1.0 
1.0 
-1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
-1.0 
1.0 
1.0 
-1.0 
-1.0 
1.0 
-1.0 
-1.0 
1.0 
1.0 
-1.0 
1.0 
1.0 
1.0 
1.0 
1.0 
-1.0 
1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
-1.0 
1.0 
-1.0 
1.0 
1.0 
-1.0 

指標數據:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 

所以這是126浮動,應該由(x, y, z) 42指數被映射。

然而,當我做下面的調用之後:

gl.glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0) 
gl.glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 6) 

的對象拿得出全部通過相互混合,絕對不是他們如何都應該看,我以爲代碼會做的是;

  • 取偏移0後的前6個索引對應的頂點數據並繪製。
  • 獲取偏移6後的前36個索引對應的頂點數據並繪製。

什麼可能的原因,這是行不通的?

回答

2

glDrawElements的最後一個參數曾經是一個指向索引數組的指針。通過VBO,這個參數被重新用作VBO中的一個字節大小的偏移量。所以它不需要索引,而是VBO到數據開始位置的字節偏移量。在你的情況下,將是sizeof(GLfloat) * x其中sizeof(GLfloat)通常是4.所以你必須乘以你的特定數據佈局,你必須乘以偏移索引4以獲得字節偏移量。

+0

它似乎是它需要'sizeof(GL_float)* x',而不是額外的'* 3',這可能是正確的嗎? – skiwi

+0

@skiwi:是的,我意外地考慮了偏移到VBOs的情況,當然使用glVertexAttribPointer的size參數,您已經有了這些信息。 – datenwolf

相關問題