3

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

这是当前我的代码绘制立方体的方式(请注意,我实际上在 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 个不同的顶点数组来做到这一点?谢谢!

4

2 回答 2

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 坐标即可在该面上获得你想要的图像部分。

于 2013-06-02T02:01:58.763 回答
-1

尽管我仍然分别画出每一面,但我发现以一种有点有效的方式来做这件事。我为每一边创建了一个不同的顶点数组和纹理,但只使用一个索引数组,其中顶点在两个三角形中描述。如果您有任何建议,请通过我的方式发送,

// 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);
}
于 2012-12-03T07:48:51.400 回答