为OpenGL转换.obj per-face变量

时间:2015-04-14 12:26:07

标签: c++ opengl .obj

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

我可以将像镜面等小变量转换为每个顶点,但整个材质可能因面对面而异;照明,环境,镜面反射,纹理贴图(漫反射法线等)。如果材料是每个网格物体很容易,那么我可以将它们作为子网格加载并在其上附加相应的材料。

我如何为一个网格处理多种材质,其中材质不均匀分布在其中?

1 个答案:

答案 0 :(得分: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,而是任何网格/材质格式。