C++ 为OpenGL转换.obj每面变量

C++ 为OpenGL转换.obj每面变量,c++,opengl,.obj,C++,Opengl,.obj,据我所知,OpenGL不支持每面属性[需要引用]。我已经决定使用.obj文件的材料文件,并且已经成功地将它们加载到我的项目中。然而,我认为材质是按对象组使用的,我意识到.obj格式实际上可以按面使用材质。因此,顶点组(或者说网格)的特定面可以有多个材质 我将能够将像镜面反射等小变量转换为逐顶点,但整个材质可能因面而异;照明、环境光、镜面反射、纹理贴图(漫反射法线等)。如果材质是每个网格,那么就很容易了,这样我就可以将它们作为子网格加载并在其上附加相应的材质 如果一个网格中的材质在其中的面之间分布

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

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


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

首先,每个面材质的值是什么?因为,除非能够在一次过程中渲染它们,否则还是可以将它们拆分为单独的网格。如果使用索引缓冲区,那么只需使用其中的一些,每种材质一个。然后,可以为每种材质类型设置/更改着色器

我的渲染器的工作方式:

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,而是任何网格/材质格式。

如果所有面都是三角形属性+GLVERTEXATTributeDivisor。但是,按材质分组的faecs可能更有效,除非每个材质确实只有很少的面。那么,我是否应该将每个“材质组”都视为子网格?啊哈,因此这些材质是保存索引缓冲区的材质。我刚刚被照亮了,谢谢。