OpenGL - 使用多个纹理加载对象

3
我正在尝试使用OpenGL绘制四轴飞行器模型。四轴飞行器对象有一个.obj文件,一个.mtl文件和三个.tga文件用于纹理(一个用于旋翼,一个用于机身,一个用于枪支)。
我的问题是我不知道如何将这三个纹理应用到对象上。我应该将对象分成三部分吗?还有更简单更有效的方法吗?
2个回答

3

最简单的方法是将对象分成三个不同的对象,否则您需要一些方法来识别纹理坐标采样的纹理。这将需要为模型中的每个顶点提供额外的信息。

我不熟悉obj格式,但我使用过的大多数格式将具有不同材料的对象分开成单独的网格,每个网格引用一个材料。


2
该对象大致如下所示...
#all vertex data (for all materials)
v 0.020542 1.017087 -0.056279
v -0.000138 0.971408 -1.947060
v 0.017678 -0.000000 -0.017678
...
usemtl material_rotors
#all faces with rotor material
f 125/185/28 142/184/3 127/183/3
f 126/186/29 138/187/29 143/188/28
usemtl material_body
#all faces with body material
f 150/190/32 132/191/32 138/192/29
f 150/190/32 138/192/29 126/193/29

您可以将所有内容存储在同一个网格对象中,而无需进行拆分,而是使用单独的绘制调用。例如:
foreach (material in model.materials)
    material.bind() //binds textures, sets colours, shader uniforms etc
    glDrawElements(GL_TRIANGLES, material.indexCount, GL_UNSIGNED_INT, model.bufferStart + material.startIndex)

这就像将整个对象视为一个模型,只是你要跟踪用特定材质绘制的面,并在绘制该范围的面时绑定适当的纹理。

你可以找到一种方法来包括每个面的材料信息并一次绑定所有纹理,但这只会引入不必要的内存和处理开销。我猜如果网格有大量不同的材料,那么按顶点存储材料参数并使用单个绘制调用可能会更有效,但这只是一个非常极端的假设。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接