2010-08-14 250 views
1

我正在爲Xcode 3.2.4中的iPhone項目工作,我希望使用OpenGL ES 2.0顯示紋理。我之前沒有很多使用OpenGL的經驗,但到目前爲止,這看起來不太可怕。到目前爲止,我主要是指OpenGL ES 2.0編程指南(黃金書)。設置OpenGL ES 2.0紋理

現在我已經有了一個基於Xcode默認OpenGL模板的項目,用我的紋理顯示代碼替換了drawFrame函數,而這個代碼又是基於黃金書中的Simple_Texture2D項目。然而,我應該繪製我的紋理的方塊不會顯示它;它是黑色的,我不知道爲什麼會發生這種情況。

這裏是並條機的內容:

[(EAGLView *)self.view setFramebuffer]; 

GLuint textureID; 

static const GLfloat squareVertices[] = 
{ 
    -0.5f, -0.33f, 
    0.5f, -0.33f, 
    -0.5f, 0.33f, 
    0.5f, 0.33f 
}; 

// Generate a 2 x 2 rgb image at 3 bytes per pixel. 
GLubyte image[4 * 3] = 
{ 
    255, 0, 0, 
    0, 255, 0, 
    0,  0, 255, 
    255, 255, 0 
}; 

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

glUseProgram(program); 

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); 
glEnableVertexAttribArray(ATTRIB_VERTEX); 

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

glGenTextures(1, &textureID); 

glBindTexture(GL_TEXTURE_2D, textureID); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

GLushort indices[] = {0, 1, 2, 3, 2, 1}; 

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); 

[(EAGLView *)self.view presentFramebuffer]; 

也許有經驗的OpenGL用戶這將是顯而易見的是什麼,我做錯了。否則,任何建議,猜測或建設性意見都是很好的。

在此先感謝!

回答

2

您不僅需要頂點位置,還需要紋理座標。就目前而言,你只是指定頂點位置,所以你只能使用最後設置的任何顏色,沒有紋理。

嘗試設置texCoord陣列並執行另一個glVertexAttribPointer(ATTRIB_TEXCOORD, ...)glEnableVertexArray(ATTRIB_TEXCOORD)

(如果你照亮你可能想法線爲好。)

sample code關閉songho's OpenGL Vertex Array頁面(glDrawElements部分)。請參閱draw3功能和先前的設置。

請注意,vertex buffer objects(和其他緩衝區對象)通常替代頂點數組(和其他緩衝區對象),作爲一次渲染批處理數據的首選解決方案。 VBOs有更多的機會被司機以高性能的方式存儲。