设置OpenGL ES 2.0纹理

时间:2010-08-14 08:25:20

标签: iphone objective-c xcode opengl-es textures

我正在开发Xcode 3.2.4中的iPhone项目,我希望使用OpenGL ES 2.0显示纹理。我以前没有太多使用OpenGL的经验,但到目前为止看起来并不太糟糕。到目前为止,我主要是指 OpenGL ES 2.0编程指南(黄皮书)。

现在我有一个基于Xcode默认OpenGL模板的项目,drawFrame函数替换为我的纹理显示代码,而后者又基于黄皮书中的Simple_Texture2D项目。然而,我应该在我的纹理上绘制的正方形不显示它;它变黑了,我不确定为什么会这样。

以下是drawFrame的内容:

[(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用户来说,显而易见的是我做错了什么。否则,任何建议,猜测或任何形式的建设性意见也都很棒。

提前致谢!

1 个答案:

答案 0 :(得分:2)

您不仅需要顶点位置,还需要纹理坐标。因为它只是指定顶点位置,所以你只能使用最后设置的颜色到顶点,没有纹理。

尝试设置texCoord数组并执行另一个glVertexAttribPointer(ATTRIB_TEXCOORD, ...)glEnableVertexArray(ATTRIB_TEXCOORD)

(如果你正在点亮,你也可能需要法线。)

sample code关闭songho's OpenGL Vertex Array页面(glDrawElements部分)。请参阅draw3功能和之前的设置。

请注意,vertex buffer objects(和其他缓冲区对象)通常会将顶点数组(和其他数组)替换为一次渲染批量数据的首选解决方案。维也纳国际组织有更多机会以高效的方式存储。