我正在尝试使用OpenGL绘制四轴飞行器模型。 quadcopter对象有一个.obj文件,一个.mtl文件和三个.tga文件用于纹理化(一个用于转子,一个用于主体,一个用于枪支)。
我的问题是我不知道如何在对象上应用这三个纹理。我应该将对象分成三部分。还有更简单,更有效的方式吗?
答案 0 :(得分:3)
最简单的方法 将对象拆分为三个不同的对象,否则你需要一些方法来识别纹理坐标采样的纹理。这将需要模型中每个顶点的附加信息。
我不熟悉obj格式,但大多数格式我使用不同材质的单独对象处理成单独的网格,每个网格引用一种材质。
答案 1 :(得分:2)
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)
将整个obj视为一个模型是相同的,除了您跟踪使用特定材质绘制的面并在绘制该范围的面时绑定适当的纹理。
您可以找到一种方法来包含每个面的材质信息并一次绑定所有纹理,但这只会引入不必要的内存和处理开销。我想如果网格物体有大量不同的材料,那么每顶点存储材料参数并使用单个绘制调用可能会更有效率,但这是一个非常极端的假设。