我正在尝试使用OpenGL绘制四轴飞行器模型。四轴飞行器对象有一个.obj文件,一个.mtl文件和三个.tga文件用于纹理(一个用于旋翼,一个用于机身,一个用于枪支)。
我的问题是我不知道如何将这三个纹理应用到对象上。我应该将对象分成三部分吗?还有更简单更有效的方法吗?
我的问题是我不知道如何将这三个纹理应用到对象上。我应该将对象分成三部分吗?还有更简单更有效的方法吗?
最简单的方法是将对象分成三个不同的对象,否则您需要一些方法来识别纹理坐标采样的纹理。这将需要为模型中的每个顶点提供额外的信息。
我不熟悉obj格式,但我使用过的大多数格式将具有不同材料的对象分开成单独的网格,每个网格引用一个材料。
#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)
这就像将整个对象视为一个模型,只是你要跟踪用特定材质绘制的面,并在绘制该范围的面时绑定适当的纹理。
你可以找到一种方法来包括每个面的材料信息并一次绑定所有纹理,但这只会引入不必要的内存和处理开销。我猜如果网格有大量不同的材料,那么按顶点存储材料参数并使用单个绘制调用可能会更有效,但这只是一个非常极端的假设。