为 OpenGL 转换 .obj 每人脸变量
Converting .obj per-face variables for OpenGL
据
我所知,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 的,而是任何网格/材质格式。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- 变量已在 .obj 中定义;这是怎么回事?
- 变量已在 .obj 中定义,但没有循环包含
- 为 OpenGL 转换 .obj 每人脸变量
- 无法打印出 obj 成员变量C++
- 为什么当我创建一个对象数组时调用默认构造函数,但当我将obj创建为简单变量时却出错
- c++类对象作为obj-c类中的实例变量