我正在使用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个不同的顶点数组?谢谢!
答案 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);
}