每个GLKit立方体面上的不同纹理

时间:2012-11-13 00:39:18

标签: ios textures glkit

我正在使用GL套件绘制一个在屏幕上旋转的立方体。我在每张脸上画出相同的纹理,效果非常好。我想在每张脸上画出不同的纹理。

这是我的代码当前绘制立方体的方式(请注意,我实际上在theTextures数组中加载了6种不同的纹理,但到目前为止,我只更改纹理时绘制了立方体的所有边)。

self.effect.texture2d0.name = theTextures[i].name;
self.effect.texture2d0.enabled = true;
self.effect.texture2d0.target = GLKTextureTarget2D;

glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);

glBindVertexArrayOES(_vertexArray); 

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);

我在stackOverflow上做了很多搜索并查看了许多教程,但找不到一个简单的方法来执行此操作。我假设我可以为每个边创建一个顶点数组,并为每个顶点数组使用glDrawElements,但这似乎非常低效。有没有办法让我这样做而不必创建6个不同的顶点数组?谢谢!

2 个答案:

答案 0 :(得分:2)

执行此操作的一种相当常见的方法是使用纹理贴图。也就是说,一个纹理包含您需要的所有子纹理。通过这种方式,您不会使大量纹理超载系统,但您仍然可以获得所需的所有图形。例如,如果此处只有4个纹理,您可能会看到如下图像:

A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 
A A A A A A A A * * * * * * * * x x x x x x x x x . . . . . . . . 

(注意:如果纹理的边是2的幂(2,4,8,16,32 ......),那么事情效果最好,尽管它不需要是方形的!)

然后,当您想要使用部分纹理时,只需选择正确的tx.s / tx.t坐标即可获得该面部所需图像的一部分。

答案 1 :(得分:-1)

我发现要以一种有效的方式做到这一点,尽管我仍然分别绘制每一面。我创建了一个不同的顶点数组&每边的纹理,但只使用一个Indice数组,顶点描述为两个三角形。如果您有任何建议,请按我的方式发送,

// draw one texture per side

for (int i = 0; i <= 5; i++)
{
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer[i]);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));
    glEnableVertexAttribArray(GLKVertexAttribColor);
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color));
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord));

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, myTexture[i].name);

    glDrawElements(GL_TRIANGLES, sizeof(Indices1)/sizeof(Indices1[0]), GL_UNSIGNED_BYTE, 0);
}
相关问题