2012-11-22 65 views
2

我在紋理每個面具有不同紋理的立方體時遇到了問題。我可以在所有面上繪製一個紋理的立方體,但是當我嘗試使用多個紋理時,它會失敗。的方式即時通訊試圖做的是像這樣:OpenGL es 2.0 glDrawElements索引指針錯誤

//my indexing array located in a header file 
#define NUM_IMAGE_OBJECT_INDEX 36 
static const unsigned short cubeIndices[NUM_IMAGE_OBJECT_INDEX] = 
{ 
    0, 1, 2, 2, 3, 0,  // front 
    4, 5, 6, 6, 7, 4,  // right 
    8, 9,10, 10,11, 8,  // top 
    12,13,14, 14,15,12,  // left 
    16,17,18, 18,19,16,  // bottom 
    20,21,22, 22,23,20  // back 
}; 
現在

在我的渲染功能,這個目前是與一個單獨的貼圖繪製立方體

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, iconTextureID); 

glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, 0); 

這不起作用

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, iconTextureID); 

glDrawElements(GL_TRIANGLES, NUM_IMAGE_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*)&cubeIndices[0]); 

它應該等同於相同的東西,從看一些其他的例子。最終我想這樣做是這樣的:

for(int i = 0; i < 6; i++){ 

    iconTextureID = textureID[i];     
    glBindTexture(GL_TEXTURE_2D, iconTextureID); 
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (const GLvoid*)&cubeIndices[i*6]); //index 0-5 use texture 1, 6-11 use texture 2, etc 

} 

有沒有人知道什麼可能是錯誤的這種索引? ive基本上覆制粘貼這個代碼從一個Android項目(工程),目前試圖做到這一點在iOS上。

+1

「*香港專業教育學院基本上是複製粘貼從Android項目(工作)的代碼,目前正在努力做到這一點關於ios。*「請停止複製粘貼代碼。試着*瞭解*代碼在做什麼,*爲什麼*該代碼在該項目中是合適的。 –

回答

4

在OpenGL ES 2.0中,索引數據可以來自緩衝區對象或指向客戶端內存的指針。你的代碼顯然是使用緩衝對象。儘管您不會顯示此緩衝區對象的創建,您上傳客戶端指針數組的位置,或者在您使用它進行渲染之前調用glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)。它必須在那裏,否則你的代碼會崩潰。當一個緩衝區被綁定到GL_ELEMENT_ARRAY_BUFFER時,OpenGL希望給glDrawElements的「指針」是一個字節偏移量進入緩衝區對象,而不是客戶端內存指針。

這就是爲什麼複製和粘貼編碼是一個壞主意。你從哪裏複製的可能是使用客戶端內存;你不是。

如果你希望你的循環代碼工作,你需要自己做指針算術:

for(int i = 0; i < 6; i++) 
{ 
    iconTextureID = textureID[i];     
    glBindTexture(GL_TEXTURE_2D, iconTextureID); 
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, reinterpret_cast<void*>(i * 6 * sizeof(GLushort))); 
} 
+0

感謝你的工作就像一個魅力,但你能幫我理解爲什麼我不能使用客戶端內存指針?這裏是我如何設置我的緩衝區等http://pastebin.com/8xgQrzDt,我需要改變什麼才能讓它工作?或者只是指向我看看的東西。還有,哪種方式更好? –

+0

@尼科爾布拉斯,你爲什麼在這裏使用reinterpret_cast? – Kimi

+1

@Kimi:因爲它是「不安全的轉換」的通用C++標誌。究竟是什麼:沒有C++認可的將整數轉換爲「void *」的方法,其數值是該整數。至少用這種方法你可以在代碼中找到它,不像'(const GLvoid *)'方式。 –