跳转到内容

跨平台游戏编程:使用 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 导出器存在错误,则可能会出现此问题。

使用自己的着色器

[编辑 | 编辑源代码]

使用离屏帧缓冲区

[编辑 | 编辑源代码]
华夏公益教科书