跨平台游戏编程:使用 gameplay3d/材质详解
外观
如你所知,gameplay3d 中的 模型 是 网格 的一个具体实例,而网格由一个或多个 网格部件 组成。
为了在 gameplay3d 中渲染 模型
,该 模型
中的每个 网格部件
都必须关联一个 材质。由于每个 网格部件
可以拥有不同的 材质
,因此 模型
的不同部分可以以不同的方式进行渲染。例如,如果你有一个穿着盔甲的角色,你可以将金属材质应用于盔甲,而将简单的纹理应用于 模型
的其余部分。
一个 材质
包含一个或多个 技术。使用 技术
的目的是在运行时轻松切换渲染技术,而无需在 网格部件
上设置完全新的材质。例如,你可能有一个 模型
,当它靠近摄像机时,你为它应用了凹凸贴图 技术
,但当你远离摄像机时,你切换到简单的纹理 技术
,以便提高性能。
每个 技术
可以拥有一个或多个 流程,每个流程对应一个 OpenGL 绘制调用。为了使用多流程渲染技术,你需要在你的 技术
中添加多个 流程
。
流程
包含
- 一个 效果,它基本上表示一个 GLSL 着色器程序(即顶点着色器和片段着色器);
- 有关渲染状态的各种信息(例如要应用的混合函数、是否启用深度测试等);
- 一个 顶点属性绑定,它封装(或者模拟,如果你的硬件不支持)一个 OpenGL VAO(顶点属性对象),并说明
网格
的数据如何与 GLSL 着色器程序中的输入相关联。
呼!这似乎是需要记住的长长的清单,但你会发现这个系统提供了很多灵活性,可以以简洁有序的方式安排你的渲染行为。
以下是可能无法看到你的模型(或模型全部显示为黑色)的一些常见原因。
- 你没有设置着色器使用的所有必需的统一变量。你是否记得为着色器中使用的 每个 统一变量调用以下函数之一?
material->getParameter([uniformName])->setValue([uniformValue])
;material->getParameter([uniformName])->bindValue([插入参数])
;或material->setParameterAutoBinding([uniformName], [自动绑定名称])
.
- 你的模型使用的网格不包含着色器所需的所有属性(即每个顶点数据)。如果你的模型是在 3D 建模程序中生成的,那么该程序是否导出了着色器所需的(例如凹凸贴图所需的切线和副法线数据)所有必要的每个顶点数据?请注意,gameplay-encoder 可以使用
-tb
选项为不包含切线和副法线数据的 FBX 模型生成切线和副法线数据。
- 你的网格数据已损坏。如果你以过程方式创建了你的网格,或者你的 3D 建模程序中的 FBX 导出器存在错误,则可能会出现此问题。