2012-08-06 131 views
0

我是OpenGL ES的新手,但對Objective-C和iOS開發頗有經驗。我到目前爲止沒有問題繪製與着色形狀使用頂點緩衝對象,通過定義頂點數組和indicies的對應陣列,用下面的代碼NEWBIE:使用有序頂點數組繪製OpenGL ES形狀

GLuint vertexBuffer; 
glGenBuffers(1, &vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Verticies), Verticies, GL_STATIC_DRAW); 

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

然後繪製到屏幕用下面的代碼:

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0); 
[_context presentRenderbuffer:GL_RENDERBUFFER]; 

這對於我可以在代碼中定義自己的基本形狀來說都很好。現在我已經有人生成了從3D圖形程序導出的.h文件,其中包含定義形狀所需的信息,但它們不包含索引數組。相反,索引信息已被嵌入到頂點數組中。頂點數組具有重複的座標,這些座標定義了它們應該繪製的順序。請參閱下面的示例代碼。我現在也有一組法線和一組紋理座標。任何人都可以告訴我(或指向我的教程/指南)我將如何使用(讀取:繪圖)此數據,而不是像以前那樣使用單獨的頂點/索引數組?提前致謝!

#define poleNumVerts 276 

static const float poleVerts [] = { 
    // f 1/1/1 2/2/2 3/3/3 
    -0.0170377877807436, -0.00478429549256308, 0.5, 
    -0.0170377877807436, 0.00409214741631937, 0.5, 
    -0.0176220932500109, -0.00034605799118996, 0.5, 
    // f 2/2/2 1/1/1 4/4/4 
    -0.0170377877807436, 0.00409214741631937, 0.5, 
    -0.0170377877807436, -0.00478429549256308, 0.5, 
    -0.015324690688248, -0.00892006666692703, 0.5, 
    // f 2/2/2 4/4/4 5/5/5 
    -0.0170377877807436, 0.00409214741631937, 0.5, 
    -0.015324690688248, -0.00892006666692703, 0.5, 
    -0.015324690688248, 0.00822795297696595, 0.5, 
    // f 5/5/5 4/4/4 6/6/6 
    -0.015324690688248, 0.00822795297696595, 0.5, 
    -0.015324690688248, -0.00892006666692703, 0.5, 
    -0.012599557156627, 0.0117794232669002, 0.5, 
    // f 6/6/6 4/4/4 7/7/7 
    -0.012599557156627, 0.0117794232669002, 0.5, 
    -0.015324690688248, -0.00892006666692703, 0.5, 
    -0.012599557156627, -0.0124715369568613, 0.5, 
    // f 6/6/6 7/7/7 8/8/8 
    -0.012599557156627, 0.0117794232669002, 0.5, 
    -0.012599557156627, -0.0124715369568613, 0.5, 
    -0.0090480845742739, -0.015196688827833, 0.5, 

    ...... <code truncated>... }; 


static const float poleNormals [] = { 
    // f 1/1/1 2/2/2 3/3/3 
    0, 0, 1, 
    0, 0, 1, 
    0, 0, 1, 
    // f 2/2/2 1/1/1 4/4/4 
    0, 0, 1, 
    0, 0, 1, 
    0, 0, 1, 
    // f 2/2/2 4/4/4 5/5/5 
    0, 0, 1, 
    0, 0, 1, 
    0, 0, 1, 
    // f 5/5/5 4/4/4 6/6/6 
    0, 0, 1, 
    0, 0, 1, 
    0, 0, 1, 
    // f 6/6/6 4/4/4 7/7/7 
    0, 0, 1, 
    0, 0, 1, 
    0, 0, 1, 
    // f 6/6/6 7/7/7 8/8/8 
    0, 0, 1, 
    0, 0, 1, 
    0, 0, 1, 
    // f 6/6/6 8/8/8 9/9/9 

    ...... <code truncated>...}; 

static const float poleTexCoords [] = { 
    // f 1/1/1 2/2/2 3/3/3 
    0.939514, 0.37333, 
    0.928115, 0.619208, 
    0.950000, 0.49702, 
    // f 2/2/2 1/1/1 4/4/4 
    0.928115, 0.619208, 
    0.939514, 0.37333, 
    0.897372, 0.25657, 
    // f 2/2/2 4/4/4 5/5/5 
    0.928115, 0.619208, 
    0.897372, 0.25657, 
    0.875352, 0.73157, 
    // f 5/5/5 4/4/4 6/6/6 
    0.875352, 0.73157, 
    0.897372, 0.25657, 
    0.795305, 0.826446, 
    // f 6/6/6 4/4/4 7/7/7 
    0.795305, 0.826446, 
    0.897372, 0.25657, 
    0.826446, 0.154695, 
    // f 6/6/6 7/7/7 8/8/8 
    0.795305, 0.826446, 
    0.826446, 0.154695, 
    0.731570, 0.074647, 
    // f 6/6/6 8/8/8 9/9/9 
    0.795305, 0.826446, 
    0.731570, 0.074647, 
    0.693430, 0.897371, 

    ..... <code truncated>.... }; 

回答

2

如果您沒有索引列表,您可能需要按順序繪製所有頂點。你可以用glDrawArrays而不是glDrawElements來做到這一點。它們是相同的,但前者不使用索引數組(這相當於將{0, 1, 2, 3, ...}的索引數組傳遞給glDrawElements)。