c++ - 为 OpenGL 转换 .obj 每面变量

标签 c++ opengl .obj

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

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

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

最佳答案

首先,这些单面 Material 有什么值(value)?因为,除非您能够一次渲染它们,否则您也可以将它们拆分成单独的网格。如果使用索引缓冲区,则只需使用其中的一些,每种 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 更改着色器,因此如果您确实需要使用多个着色器而不是仅仅更改 uniform,则需要将它们一起批处理。

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

关于c++ - 为 OpenGL 转换 .obj 每面变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29627298/

相关文章:

javascript - 为导入的 .obj 文件 three.js 禁用背面剔除

c# - 当 C++ 调用 C# 函数时,如何从 C# 调用 C++ 委托(delegate)函数?

c++ - 在模板中获取非常量类型

windows - 使用全屏 OpenGL 应用程序时是否可以保持 Windows 的合成器正常工作?

c++ - 旋转两个球体

javascript - Three.js 鼠标拾取对象

linker - 如何将目标文件链接到 UEFI DXE/EFI 驱动程序?

c++ - 将 Visual C++ 项目迁移到 Visual Studio 2013 后出现错误 : MFC requires use of Winsock2. h

c++ - 静态链接 GLU?

c++ - 为什么<gl/GL.h>中没有缓冲区