【问题标题】:Converting .obj per-face variables for OpenGL为 OpenGL 转换每个面的 .obj 变量
【发布时间】:2015-06-20 01:27:08
【问题描述】:

据我所知,OpenGL 不支持每个面的属性 [需要引用]。我决定使用 .obj 文件的材料文件,并且已经成功地将它们加载到我的项目中。但是,我认为材质是按对象组使用的,我意识到 .obj 格式实际上可以使用每个面的材质。因此,一个顶点组(或者说,网格)可以有多个特定面的材质。

我可以将镜面反射等小变量转换为每个顶点,但整个材质可能因面而异;照明、环境、镜面反射、纹理贴图(漫反射法线等)。如果材质是 per-mesh 会很容易,这样我就可以将它们加载为子网格并在它们上附加相应的材质。

我将如何处理一个网格的多种材料,其中材料在其中的面之间分布不均匀?

【问题讨论】:

  • 如果所有面都是三角形属性+glVertexAttribDivisor。但是,除非您真的每种材料的面孔很少,否则按材料对粪便进行分组可能更有效。
  • 那么,我是否应该将每个“材质组”都视为子网格?

标签: c++ opengl .obj


【解决方案1】:

首先,这些单面材料具有什么价值?因为,除非您能够一次性渲染它们,否则您也可以将它们拆分为单独的网格。如果使用索引缓冲区,则只需使用其中的几个,每种材料一个。然后您可以为每种材质类型设置制服/更改着色器。

我的渲染器的工作方式:

iterate through meshes
    bind mesh's vertex array object
    bind mesh's uniform buffer object
    iterate through mesh's materials
        use shaders, bind textures, set uniforms...
        draw material's index buffer with glDrawElements

当然,您不会希望为每种材质都更改着色器,因此如果您确实需要使用多个着色器而不仅仅是更改制服,那么您需要将它们一起批处理。

这不是特定于 obj/mtl,而是任何网格/材质格式。

【讨论】:

  • 啊哈,所以材料是保存索引缓冲区的材料。我刚刚被照亮了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
相关资源
最近更新 更多