为 OpenGL 转换 .obj 每人脸变量

Converting .obj per-face variables for OpenGL

本文关键字:变量 obj OpenGL 转换      更新时间:2023-10-16

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