【问题标题】:OpenGL - loading an object with multiple textureOpenGL - 加载具有多个纹理的对象
【发布时间】:2014-08-29 16:07:24
【问题描述】:

我正在尝试使用 OpenGL 绘制四轴飞行器模型。 quadcopter 对象有一个 .obj 文件、一个 .mtl 文件和三个用于纹理的 .tga 文件(一个用于转子,一个用于机身,一个用于枪)。

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

【问题讨论】:

    标签: c++ opengl texture-mapping .obj


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 视为一个模型相同,只是您要跟踪使用特定材质绘制的面并在绘制该范围的面时绑定适当的纹理。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 2020-03-09
        • 2011-07-03
        • 2012-07-23
        • 1970-01-01
        • 2018-05-28
        • 1970-01-01
        相关资源
        最近更新 更多