2012-11-13 73 views
3

我使用GL Kit繪製一個在屏幕上旋轉的立方體。我的這個效果非常好,每張臉上都繪製了相同的紋理。我想在每張臉上繪製不同的紋理。每個GLKit立方體表面上的不同紋理

這是目前我的代碼是如何繪製立方體(注意,我居然有theTextures陣列中裝載6層不同的紋理,但是當我改變紋理到目前爲止,我只畫立方體相同的各邊)。

self.effect.texture2d0.name = theTextures[i].name; 
self.effect.texture2d0.enabled = true; 
self.effect.texture2d0.target = GLKTextureTarget2D; 

glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 

glBindVertexArrayOES(_vertexArray); 

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0); 

我在這裏做了很多的搜索在計算器上,看着很多教程,但無法找到一個簡單的方法來做到這一點。我假設我可以爲每個邊創建一個頂點數組,併爲每個頂點數組使用glDrawElements,但這看起來效率很低。有沒有辦法讓我做到這一點,而不必創建6個不同的頂點數組?謝謝!

回答

-1

我找到了一個有效的方式做到這一點,雖然我仍然分開繪製每一面。我爲每一邊創建了一個不同的頂點數組紋理,但只使用一個具有兩個三角形中描述的頂點的Indice數組。如果您有任何建議,請將它們發送給我,

// draw one texture per side 

for (int i = 0; i <= 5; i++) 
{ 
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer[i]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position)); 
    glEnableVertexAttribArray(GLKVertexAttribColor); 
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color)); 
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord)); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, myTexture[i].name); 

    glDrawElements(GL_TRIANGLES, sizeof(Indices1)/sizeof(Indices1[0]), GL_UNSIGNED_BYTE, 0); 
} 
+0

你能發佈你的完整源代碼嗎?我正在嘗試做同樣的事情。 – Clay

+0

尼克斯最後的評論。我最終選擇了下面的Texture Map解決方案。它最終變得容易得多。 – Clay

2

一個相當常見的方法是使用紋理貼圖。也就是說,一個紋理包含您需要的所有子紋理。通過這種方式,您不會使用大量紋理重載系統,但仍然可以獲取所需的所有圖形。例如,如果在這裏只有4紋理,你可能有一個看起來像這樣的圖片:

A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 

(注:事情的工作最好的,如果你的紋理的兩側是兩(2,4,8電源,然而,當你想使用紋理的一部分時,只需選擇正確的tx.s/tx.t座標來獲得零件的位置你想要的那張臉上的圖像。

相關問題