2010-08-14 165 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有更多的机会被司机以高性能的方式存储。