繁体   English   中英

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

[英]different texture on each GLKit cube face

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

一种相当常见的方法是使用纹理贴图。 也就是说,一个纹理包含您需要的所有子纹理。 通过这种方式,您不会使大量纹理超载系统,但您仍然可以获得所需的所有图形。 例如,如果这里只有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坐标即可获得该面部所需图像的一部分。

我发现要以一种有效的方式做到这一点,尽管我仍然分别绘制每一面。 我为每一面创建了一个不同的顶点数组和纹理,但只使用一个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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM