C++ OpenGL-加载具有多个纹理的对象

C++ OpenGL-加载具有多个纹理的对象,c++,opengl,texture-mapping,.obj,C++,Opengl,Texture Mapping,.obj,我正试图用OpenGL绘制一个四架直升机模型。quadcopter对象有一个.obj文件、一个.mtl文件和三个用于纹理处理的.tga文件(一个用于转子,一个用于机身,一个用于枪) 我的问题是我不知道如何在对象上应用这三种纹理。我应该把这个物体一分为三吗。还有更简单、更有效的方法吗?最简单的方法是将对象分割为三个不同的对象,否则您将需要某种方法来识别纹理坐标采样的纹理。这将需要模型中每个顶点的附加信息 我不熟悉obj格式,但我使用过的大多数格式都是将具有不同材质的单独对象放入单独的网格中,每个网

我正试图用OpenGL绘制一个四架直升机模型。quadcopter对象有一个.obj文件、一个.mtl文件和三个用于纹理处理的.tga文件(一个用于转子,一个用于机身,一个用于枪)

我的问题是我不知道如何在对象上应用这三种纹理。我应该把这个物体一分为三吗。还有更简单、更有效的方法吗?

最简单的方法是将对象分割为三个不同的对象,否则您将需要某种方法来识别纹理坐标采样的纹理。这将需要模型中每个顶点的附加信息


我不熟悉obj格式,但我使用过的大多数格式都是将具有不同材质的单独对象放入单独的网格中,每个网格引用一种材质。

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视为一个模型相同,不同的是,您可以跟踪使用特定材质绘制的面,并在绘制该范围的面时绑定适当的纹理

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