如果我有一个网格(例如有 6 个面的立方体,每个面分别由 4 个顶点组成,总共 24 个顶点),并且我想对每个面应用不同的纹理,我该怎么做?目前,我使用 glDrawElements() 一次绘制整个网格(立方体的所有 6 个面),将所有索引提供到一个缓冲区中。我看不到在绘图时将纹理应用于索引子集的方法。我是否必须拆分索引,逐一绘制每个面,重新绑定每个面之间的纹理,或者是否有更雄辩的解决方案?
是的,您必须以不同的方式渲染每个面(相应地将其分割并绑定每个面的纹理)。它并不优雅,也不漂亮,但如果你的索引位于它们自己的元素缓冲区(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
或类似的事情,我不是entirely确定你会如何做,但我想你可能可以slice http://developer.android.com/reference/java/nio/ShortBuffer.html#slice()根据需要并为每个不同纹理的面获取必要的缓冲区。无论哪种方式,过程都保持相对相同:分割网格并为每个面绑定纹理并仅绘制与该面相对应的索引。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)