为 OpenGL 转换 .obj 每面变量

Converting .obj per-face variables for OpenGL

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

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

我如何处理一个网格的多个 material,其中 material 没有均匀分布在其中的面中?

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

我的渲染器的工作方式:

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

当然,您不会想要为每个 material 更改着色器,因此如果您确实需要使用多个着色器而不是仅仅更改制服,则需要将它们一起批处理。

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