在OpenGL ES 1.1中将多个纹理绑定到一个网格

时间:2011-07-22 20:33:30

标签: android opengl-es textures mesh

如果我有一个网格(例如一个有6个面的立方体,每个面包含4个顶点,总共24个顶点),我想对每个面应用不同的纹理,我该怎么做?目前我使用glDrawElements()一次绘制整个网格(立方体的所有6个面),将所有索引提供到一个缓冲区中。在绘制时,我看不到将纹理应用于索引子集的方法。我是否必须拆分索引,逐个绘制每个面,在每个面之间重新绑定纹理,还是有更有说服力的解决方案?

2 个答案:

答案 0 :(得分:7)

是的,你必须以不同的方式渲染每个面部(相应地将它分开并绑定每个面部的纹理)。它不优雅而且不漂亮,但是如果你的索引在它们自己的元素缓冲区(GL缓冲区,而不是ShortBuffer或类似的东西)中,它就相当简单了。您可以使用glDrawElements指定缓冲区的偏移量,并为每个面绘制三角形的数量。然后它就像这样(伪代码):

static class IndexRange
{
    public int offset
    public int numIndices
}

// ... later, down the hall and to the left ...

int faceTextures[] = {tex0, tex1, tex2, ...}
IndexRange faceIndices[] = {face0, face1, face2, ...}

// setup buffers and all that jazz

for (index = 0; index < numFaces; ++index)
{
    IndexRange face = faceIndices[index]
    int texture = faceTextures[index]

    glBindTexture(GL_TEXTURE_2D, texture)
    glDrawElements(GL_TRIANGLES, face.numIndices, GL_UNSIGNED_SHORT, face.offset)
}

如果你正在使用ShortBuffer或类似的东西,我不会完全确定你是怎么做的,但我想你可能{{3它根据需要为每个不同纹理的面部获取必要的缓冲区。无论哪种方式,该过程保持相对相同:拆分网格和每个面,绑定纹理并仅绘制对应于该面的索引。

答案 1 :(得分:0)

你必须使用很少的纹理单位。查看specification中功能glClientActiveTexture()的文档。另请参阅this question

更新:你也可以考虑使用libgdx,一个非常好的OpenGL ES包装器(以及更多)。