如何在OpenGL ES 2.0中为每个网格加载不同的纹理?

时间:2012-12-15 11:20:35

标签: iphone ios opengl-es-2.0

我是OpenGL ES的新手,我正在尝试做一些基本的东西作为我学习曲线的一部分。我能够渲染两个网格,一个球体和一个带有两个glDrawArrays调用的立方体。我试图加载一个不同的纹理来包裹立方体和球体,但发生的是最后加载的纹理被包裹到两个网格。有谁知道为什么会发生这种情况?

以下是网格的代码:

glEnable(GL_DEPTH_TEST);

glGenVertexArraysOES(1, &vertexArray);
glBindVertexArrayOES(vertexArray);

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeMeshVerts, meshVerts, GL_STATIC_DRAW);

glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(0));

glEnableVertexAttribArray(GLKVertexAttribNormal);
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(4*3));

glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 4*8, BUFFER_OFFSET(4*6));

// Texture
// Create image from file
NSString *path = [[NSBundle mainBundle] pathForResource:textureImage ofType:@"jpg"];
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:texData];

//生成一个新的OpenGL ES纹理缓冲区和    //使用来自的像素数据初始化缓冲区内容    //指定的Core Graphics图像,cgImage。

[TextureLoader textureWithCGImage:image.CGImage options:nil error:NULL];

glBindVertexArrayOES(0);

这是绘图代码:

glBindVertexArrayOES(_vertexArray);

// Render the object with ES2
glUseProgram(_program);

// Set the sampler texture unit to 0
glUniform1i (uniforms[UNIFORM_TEXTURE_MATRIX], 0);

glDrawArrays(GL_TRIANGLES, 0, numVertices);

1 个答案:

答案 0 :(得分:1)

在渲染之前,您没有将纹理绑定到采样器。首先,您需要保留对GLKTextureInfo返回的textureWithCGImage:对象的引用,然后您可以使用带有纹理名称的glBindTexture将其绑定到当前的样本器。例如

GLKTextureInfo *tex = [TextureLoader textureWithCGImage:image.CGImage options:nil error:NULL];
...
glBindTexture(GL_TEXTURE_2D, tex.name);

您需要在每次绘制调用之前执行此操作,以便为采样器设置正确的纹理。您可以将所需的每个纹理绑定到不同的采样器,然后只传入正确的采样器制服。