【问题标题】:Binding Multiple Textures to One Mesh in OpenGL ES 1.1在 OpenGL ES 1.1 中将多个纹理绑定到一个网格
【发布时间】:2011-07-22 20:33:30
【问题描述】:

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

【问题讨论】:

    标签: android opengl-es textures mesh


    【解决方案1】:

    是的,您必须以不同的方式渲染每个面(相应地拆分它并为每个面绑定纹理)。它既不优雅也不漂亮,但如果您将索引放在自己的元素缓冲区(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 或类似的东西,我不完全确定您将如何去做,但我想您可能会将 slice 用作需要并为每个不同纹理的面获取必要的缓冲区。无论哪种方式,过程都保持相对相同:拆分网格并为每个面绑定纹理并仅绘制与该面对应的索引。

    【讨论】:

    • 这就是要走的路。使用 Java 缓冲区的一种方法是在绘制期间修改缓冲区。但是,我通常使用 VBO 来轻松设置顶点的偏移量,并且我跳过使用常规顶点数组,因为现在几乎所有 Android 手机都支持 VBO。
    【解决方案2】:

    您必须使用少量纹理单元。检查specification 中函数glClientActiveTexture() 的文档。另见this question

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

    【讨论】:

    • 我真的没有得到这个答案解决问题的印象。 glClientActiveTexture 与我所见并没有太大关系,而且您还没有解释您所链接问题的相关性。告诉他/她只使用“非常好的......包装器”也不能解释提问者为什么应该使用包装器或它如何解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多