2012-12-24 73 views
4

過去幾天我已經開始深入OpenGL ES 2.0,但我仍然得到了非常錯誤的結果。我不明白的一件事是,我應該如何正確設置我的緩衝區。關於我的OpenGL的問題 - 代碼

我想創建一個這樣的形狀:一種帳篷,如果你喜歡,沒有左側和右側。

3_______________________2 
|\      /| 
| \_ _ _ _ _ _ _ _ _ _/ |   
| /4     5\ | 
|/_____________________\| 
0      1 

因此,讓我們開始與我的紋理/指數/頂點數組:

這是我設置:

#define RECT_TOP_R  {1, 1, 0} 
#define RECT_TOP_L  {-1, 1, 0} 
#define RECT_BOTTOM_R {1, -1, 0} 
#define RECT_BOTTOM_L {-1, -1, 0} 
#define BACK_RIGHT  {1, 0, -1.73} 
#define BACK_LEFT  {-1, 0, -1.73} 

const GLKVector3 Vertices[] = { 
    RECT_BOTTOM_L, //0 
    RECT_BOTTOM_R, //1 
    RECT_TOP_R,  //2 
    RECT_TOP_L,  //3 
    BACK_LEFT,  //4 
    BACK_RIGHT  //5 

}; 

const GLKVector4 Color[] = { 
    {1,0,0,1}, 
    {0,1,0,1}, 
    {0,0,1,1}, 
    {0,1,0,1}, 
    {1,0,0,1}, 
    {0,1,0,1}, 
    {0,0,1,1}, 
    {0,1,0,1} 
}; 

const GLubyte Indices[] = { 
    0,1,3, 
    2,4,5, 
    0,1 
}; 

const GLfloat texCoords[] = { 
    0,0, 
    1,0, 
    0,1, 
    1,1, 
    1,1, 
    0,0, 
    0,0, 
    1,0 
}; 

我在這裏生成/綁定緩存。

glGenBuffers(1, &vertexArray); 
glBindBuffer(GL_ARRAY_BUFFER, vertexArray); 
glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition,3,GL_FLOAT,GL_FALSE,sizeof(Vertices),0); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 

glGenBuffers(1, &indexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); 


glGenBuffers(1, &colArray); 
glEnableVertexAttribArray(GLKVertexAttribColor); 
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Color), 0); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Color), Color, GL_STATIC_DRAW); 

glGenBuffers(1, &texArray); 
glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(texCoords),0); 
glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW); 

所以我有一個關於緩衝區一個問題:

  • 是什麼GL_ARRAY_BUFFER和GL_ELEMENT_ARRAY_BUFFER之間的區別?

這裏是gelegate方法,這就是所謂每當重繪:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 


    self.contentScaleFactor = 2.0; 
    self.opaque = NO; 

    glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    [self.effect prepareToDraw]; 

    glDrawElements(GL_TRIANGLE_STRIP, sizeof(Indices), GL_UNSIGNED_BYTE, 0); 


} 

所以,代碼顯然不能相應工作。你可以幫我嗎 ?我一直試圖讓它起作用,但我正在失去我的神經。

+2

明白了,忘了綁定緩衝區。 *捂臉* –

回答

0

好吧,所以我在那裏肯定做錯了事。我從基本上將所有頂點數據存儲在一個結構中的網站重用了代碼。然而,我已經改變了代碼,因爲我已經將單獨的屬性數組(顏色,紋理座標)分爲單獨的數組。之前,該結構被自行緩衝,所以該結構由GPU作爲整體與紋理數組和顏色數組一起處理。現在 - 在我更改之後 - 我需要單獨生成並綁定這些緩衝區。

我可以部分解決的另一個問題是具有索引和紋理映射的問題。我不知道我是否理解了這一點,但是如果我將紋理座標(x,y)分配給某個索引,然後重新使用該索引 - 目的是在該確切位置有另一個紋理座標 - 那麼顯然我不會有理由想知道爲什麼一切都搞砸了。

我最終做了什麼並沒有完全解決我的問題,但是我更接近於我設定的目標,就openGL而言,我爲我的學習曲線感到非常自豪。 此答案適用於可能面臨同樣問題的其他人,並且我希望在此不要傳播任何錯誤信息。請隨時編輯/指出任何錯誤。

0

爲了迴應您自己的回答,您提到的結構中的頂點數據稱爲數組的結構。蘋果推薦你使用這個layout