RAGE 来 了 --- 关 于 ID TECH 5 MEGATEXTURE 的 一 些 技 术 信 息 更 新 H3D 姚 勇 信 息...1 介 绍...2 一, 目 的...2 二, 实 现...2 1, 预 处 理...3 1.1 贴 图 预 处 理... 3 1.2 几 何 预 处 理... 7 2, 绘 制...7 3, 具 体 步 骤... 8 3.1 判 断 本 帧 绘 制 要 用 到 哪 些 page...8 3.2 读 入 贴 图 page...10 3.3, 渲 染... 12 4, 镜 头 快 速 转 动 与 移 动 时... 14 5, 一 些 问 题... 14 总 结...15 PS. H3D2 Engine... 15 信 息 很 久 很 久 以 前,ID TECH 5 有 风 声 时, 我 曾 经 查 到 一 篇 论 文 就 当 时 id software 公 司 的 MEGATEXTURE 技 术 做 了 一 些 介 绍 是 关 于 Clipmap 的 id software 采 用 此 技 术 制 作 了 Quake War 之 后, 公 司 很 快 更 新 了 ID TECH 5(MEGATEXTURE v2.0), 采 用 了 类 似 Virtual Texture 的 技 术, 做 到 了 地 形 和 场 景 物 体 都 使 用 一 张 超 大 全 细 节 贴 图 做 texture streaming 如 今 RAGE 已 经 发 行 作 为 id 技 术 fan 买 了 PS3 正 版 之 后, 很 失 望... 游 戏 体 验, 尤 其 在 贴 图 绘 制 上 很 糟 糕 后 来 发 现 在 PC 上 的 体 验 其 实 不 错 贴 图 loading 的 感 觉 较 小 原 因 大 概 因 为 id software 在 PS3 上 优 化 的 不 够 或 者 PS3 架 构 就 不 适 合 id tech5 Clipmap 是 用 于 地 形 渲 染 的 优 点 是 绘 制 超 大 细 节 地 形 纹 理, 不 受 显 卡 显 存 限 制, 而 且 不 需 要 过 多 预 处 理 过 程 在 使 用 ID TECH 5 技 术 的 RAGE 中, 不 再 使 用 clipmap 而 是 使 用 一 种 基 于 virtual texture 的 技 术 关 于 virtual texture 技 术 雏 形, 最 早 源 自 上 个 世 纪 一 家 名 叫 3DLABS 的 显 卡 公 司 那 时 是 实 现 在 硬 件 中 的 这 点 与 clipmap 很 类 似 id software 的 纯 软 件 技 术 实 现 的 灵 感 则 来 自 一 篇 04 年 的 叫 Unified Texture Management for Arbitrary Meshes 论 文 最 终 id 实 现 的 这 个 技 术 应 该 比 3DLABS 的 要 远 远 复 杂 得 多 并 且 包 含 非 常 多 的 技 术 实 现 与 优 化 细 节 以 及 全 套 美 术 制 作 流 水 线 一 个 引 擎 和 游 戏 开 发 了 6 年 多, 复 杂 是 显 而 易 见 在 08 年 GDC 上 一 位 技 术 爱 好 者 凭 着 一 些 隐 约 的 ID TECH 5 线 索, 以 及 有 限 的 paper, 自 己 实 现 了 一 套 类 似 megatexture 的 技 术 09 年 id software 做 技 术 介 绍 时, 证 明 这 位 仁 兄 的
实 现 和 id 的 很 像 同 时 08 年 crytek 公 司 也 介 绍 了 他 们 在 cryengine 中 实 现 的 virtual texture 的 想 法 具 体 virtual texture 的 技 术, 要 做 成 产 品 级 应 用, 实 现 非 常 复 杂 是 一 个 工 程 难 度 很 高 的 技 术 本 人 没 做 过 只 简 单 介 绍 一 下 水 平 有 限, 不 保 证 信 息 的 完 全 准 确 介 绍 一, 目 的 为 何 需 要 这 个 技 术 简 单 讲 原 因 有 二 第 一, 显 存 有 限 次 世 代 游 戏 动 辄 就 要 几 百 兆 显 存 来 支 持 精 细 的 各 种 贴 图 ( diffuse, specular, 各 种 mask, 各 种 bump, 各 种 env, decal, 等 等 等 等 ) 随 着 游 戏 制 作 规 模 增 大, 要 更 多 的 贴 图 来 满 足 眼 球 只 有 更 精 制, 没 有 最 精 制 关 卡 没 有 最 大, 只 有 更 大 但 是 显 存 有 限 第 二, 普 通 制 作 游 戏 场 景 中 的 各 种 景 物, 贴 图 重 复 使 用 是 非 常 关 键 的 事 情 因 为 一 个 3D 游 戏, 关 卡 足 够 大, 虚 拟 现 实 沉 浸 感 才 强 细 节 物 体 要 多 只 有 更 多, 没 有 最 多 更 大 的 场 景 更 多 的 景 物, 需 要 更 多 的 贴 图 是 一 方 面, 另 外 一 方 面, 需 要 美 术 对 贴 图 的 复 用 考 虑 更 多, 在 制 作 上 也 需 要 大 量 精 力 去 调 整 UV 和 优 化 为 了 节 省 贴 图, 一 般 美 术 制 作 还 需 要 使 用 贴 图 Tilling 就 是 一 张 贴 图 重 复 排 列 开 来, 铺 在 面 积 很 大 的 物 体 表 面 上 这 样 显 得 很 假 这 需 要 美 工 花 极 大 精 力 去 制 作 既 要 重 复 排 列 又 不 能 显 得 重 复 性 太 明 显 的 贴 图 美 工 很 多 工 作 并 不 是 象 绘 制 图 画 一 样, 而 是 更 像 个 砌 墙 工, 竭 力 想 用 重 复 的 材 料 堆 砌 出 不 一 样 的 效 果 生 产 力 不 够 高 二, 实 现 virtual texture 想 法 很 直 接 : 假 设 屏 幕 分 辨 率 1680x1050 那 么 这 个 屏 幕 可 以 显 示 的 贴 图 图 素 (texel) 数 据, 最 多 不 过 1680x1050x3 字 节 如 果 我 们 把 屏 幕 上 要 显 示 的 景 物, 面 向 屏 幕 的 可 见 部 分, 精 确 的 制 作 一 张 贴 图, 那 么 这 个 贴 图 最 大 就 需 要 1680x1050x3 = 5MB 前 提 是 屏 幕 上 显 示 的 景 物, 背 对 屏 幕 的 地 方 和 被 遮 挡 的 地 方 都 没 有 贴 图 如 果 我 们 能 够 实 时 创 建 这 么 一 张 贴 图 来 显 示 场 景, 我 们 显 卡 的 贴 图 用 显 存 只 用 5MB 就 完 全 够 了 这 种 极 端 的 情 况 用 现 有 的 硬 件 实 现 起 来 恐 怕 不 太 现 实 退 而 求 其 次 : 我 们 有 一 些 cache 做 冗 余, 景 物 有 一 些 互 相 遮 挡 的 绘 制, 就 算 6 张 屏 幕 大 小 的 贴 图, 重 叠 遮 挡 绘 制 3 次, 每 个 像 素 4 字 节, 那 么 在 这 种 很 差 的 情 况 下, 我 们 也 就 需 要 120MB 贴 图 在 次 世 代 游 戏 显 卡 上, 这 个 要 求 不 算 过 分 所 以 自 然 而 然 产 生 了 一 个 想 法 那 就 是 把 这 个 游 戏 所 有 要 用 到 的 贴 图 全 部 放 在 一 张 超 大 的 贴 图 上 在 绘 制 每 一 帧 时, 只 把 屏 幕 上 要 显 示 出 来 的 最 高 精 细 度 贴 图 从 硬 盘 上 装 载 到 显 卡 显 存, 绘 制 出 来 就 可 以 了 下 一 帧 玩 家 镜 头 移 动 时, 再 去 装 载 新 景 物 的 高 精 度 贴 图 如 果 不 装 载 高 精 度 贴 图, 景 物 可 以 用 很 低 精 度 的 贴 图 显 糊 弄 一 下 (Mipmap Level 很 高 ) 这 个 过 程 如 果 很 快, 并 且 只 有 离 玩 家 较 远 的 新 显 示 景 物 去 装 载 高 精 度 贴 图 那 么 就 可 以 用 一 张 没 有 容 量 限 制 的 超 大 的 贴 图 ( 硬 盘 限 制 ), 在 显 存 有 限 的 硬 件 上, 绘 制 一 帧 中 眼 力 所
及 的 整 个 世 界 并 且 这 个 世 界 的 精 度 不 会 太 受 影 响 换 句 话, 游 戏 世 界 的 贴 图 制 作 不 用 考 虑 显 存 大 小 并 且, 美 术 制 作 这 个 世 界 时, 只 用 很 直 接 的 2 步 1, 做 网 格 2, 给 这 个 网 格 绘 制 唯 一 的 贴 图 不 用 考 虑 贴 图 复 用 ID TECH5 的 megatexture 技 术 就 是 要 实 现 这 个 目 标 1,, 预 处 理 1.1 贴 图 预 处 理 在 渲 染 之 前, 数 据 制 作 阶 段 时, 先 需 要 做 一 些 预 处 理 最 重 要 的 一 个 处 理, 就 是 把 世 界 中 用 到 的 所 有 贴 图 全 部 先 放 入 一 张 巨 大 的 贴 图 这 也 就 是 megatexture 了 我 们 今 后 把 这 张 能 够 绘 制 整 个 世 界 的 唯 一 贴 图 叫 做 :virtual texture 这 张 贴 图 可 以 很 大, 比 如 边 长 200 多 万 像 素, 即 一 张 4T 大 小 的 贴 图 ( 当 然 游 戏 中 没 有 必 要 这 么 大 ) 接 着, 按 照 一 个 固 定 大 小 的 尺 寸 ( RAGE 中, 是 128x128), 把 virtual texture 切 割 成 方 块 这 个 方 块, 我 们 称 作 页 (pages) 在 这 里, 对 mipmap 的 处 理 有 点 特 殊 所 有 贴 图 的 mipmap, 每 一 层 也 都 按 照 这 个 固 定 大 小 切 成 page 如 果 一 张 贴 图 的 某 一 层 mipmap 尺 寸 小 于 page 的 尺 寸, 就 停 止 切 割 然 后 把 mipmap 切 割 出 来 的 page 也 放 在 virtual texture 文 件 里 以 下 是 一 张 贴 图 和 这 张 贴 图 的 mipmap, 被 切 割 为 page 的 样 子 从 左 到 右 依 次 是 mipmap level 0,1,2,3 这 也 是 virtual texture 文 件 中 的 内 容 把 这 些 page 调 入 显 存, 再 去 显 示 场 景 如 果 我 们 故 意 保 留 切 割 的 痕 迹, 让 我 们 看 一 下 场 景 会 是 怎 么 样 的 :
在 RAGE 中, 一 张 virtual texture 是 128k x 128k 大 小 这 里 我 们 说 的 virtual texture 的 尺 寸, 是 最 高 精 度 的 贴 图 尺 寸 一 个 page 是 128 像 素 以 下 是 RAGE 中 一 个 局 部 的 4 级 mipmap 在 virtual texture 中 的 样 子 可 以 看 到 4 张 截 图, 字 体 的 4 种 颜 色 代 表 着 4 级 mipmap 2 个 数 字 是 page 在 virtual texture 中 的 全 局 唯 一 标 号 场 景 截 图 中, 最 靠 近 镜 头 的 标 号 颜 色, 是 mipmap 精 度 最 大 的 层 随 着 距 离 渐 远, 标 号 颜 色 也 体 现 了 使 用 精 度 更 低 的 mipmap 其 中 白 色 的 格 子 表 明 是 page 的 分 界 线 LEVEL0:
LEVEL 1: LEVEL2:
LEVEL3: 注 意 这 里 是 对 同 一 部 位 不 同 mipmap 在 virtual textuer 上 的 截 图 这 些 图 都 是 放 在 virtual texture 一 个 文 件 里 的 再 给 个 例 子 这 个 是 一 个 virtual texture 文 件 内 部 可 能 的 一 种 组 织 形 式 :
1.2 几 何 预 处 理 把 所 有 物 体 的 贴 图 拼 接 在 一 起 变 为 一 整 张 virtual texture( 也 就 是 megatexture) 后, 世 界 中 所 有 的 物 体 都 只 使 用 virtual texture 这 么 一 张 贴 图 所 以 世 界 中 物 体 的 坐 标 都 应 该 换 算 一 下 假 设 virtual texture 是 一 张 131072 x 131072 大 小 的 贴 图 virtual texture 左 下 角 贴 图 坐 标 为 (0,0). 右 上 角 贴 图 坐 标 为 (1,1). 根 据 一 个 物 体 贴 图 在 virtual texture 中 所 在 的 相 对 位 置, 用 很 简 单 的 换 算 即 可 得 到 这 个 物 体 新 的 贴 图 坐 标 比 如 一 个 物 体 有 一 张 512x256 的 长 方 形 贴 图 位 于 virtual texture 中 从 横 向 第 8088 个 像 素, 纵 向 第 11901 个 像 素 开 始 这 样 物 体 一 个 顶 点 的 贴 图 坐 标 u,v (0<u<1,0<v<1) 换 算 到 virtual texture 中, 就 是 u' = (u*512 + 8088)/ 131072, v'= (v*256+11901)/131072 当 贴 图 坐 标 u,v<0 或 者 u,v>1 时, 说 明 使 用 了 纹 理 tilling 贴 图 重 复 排 列 这 时 的 处 理, 需 要 在 virtual texture 中 重 复 复 制 物 体 所 用 到 的 贴 图 然 后 把 贴 图 坐 标 重 新 换 算 到 0-1 之 间 再 进 行 virtual texture 贴 图 坐 标 转 换 2,, 绘 制 接 下 来 绘 制 我 们 做 最 简 化 情 况 的 假 设, 有 3 步 要 走 : 1, 判 断 需 要 哪 些 pages 判 断 屏 幕 上 需 要 绘 制 哪 些 贴 图 以 及 屏 幕 像 素 上 那 个 贴 图 用 到 的 mipmap 级 别 因 为 世 界 所 有 贴 图 都 以 page 为 单 位, 拼 在 磁 盘 上 的 一 张 megatexture 里 没 法 一 次 性 调 入 显 存 要 判 断 出 真 的 需 要 哪 些 贴 图, 以 及 那 个 贴 图 的 mipmap 级 别 才 会 把 需 要 的 那 部 分 pages 装 载 2, 装 载 靠 streaming 把 需 要 的 贴 图 pages 装 载 进 来 放 入 显 存 的 一 张 实 际 要 使 用 的 贴 图 ( 在 id software 的 介 绍 中 叫 physical page texture, 在 本 篇 文 章 中 叫 显 存 贴 图 这 张 显 存 贴 图, 是 由 很 多 pages 拼 凑 而 成 的
3, 绘 制 场 景 物 体 绘 制 过 程 中, 在 pixel shader 中, 把 屏 幕 上 所 有 景 物 的 贴 图 坐 标 重 新 换 算 一 下 以 便 用 显 存 贴 图 ( 贴 图 内 容 是 从 磁 盘 上 靠 streaming 读 出 来 的 小 块 贴 图 (pages) 拼 凑 而 成 ) 来 正 确 绘 制 场 景 物 体 因 为 场 景 中 的 物 体 在 美 术 制 作 时, 是 按 照 普 通 展 UV 的 方 式 制 作 的 3,, 具 体 步 骤 以 下 对 上 面 说 的 3 个 步 骤 做 具 体 介 绍 3.1 判 断 本 帧 绘 制 要 用 到 哪 些 page page 中 不 仅 仅 记 录 了 物 体 原 始 贴 图 的 某 个 部 分, 同 时 这 个 原 始 贴 图 的 mipmap 也 都 切 成 块 当 作 page 储 存 在 virtual texture 中 所 以 这 一 步 骤 不 仅 要 找 到 屏 幕 上 物 体 用 的 贴 图 在 virtual texture 中 的 位 置, 还 需 要 判 断 使 用 了 哪 个 mipmap 层, 这 样 才 能 精 确 定 位 出 屏 幕 上 物 体 渲 染 需 要 的 所 有 pages 因 为 不 同 mipmap 级 别 的 page 放 在 了 文 件 不 同 地 方 用 一 个 简 单 的 实 现 办 法 概 述 这 个 过 程 : 物 体 贴 图 坐 标 本 身 就 说 明 了 所 用 到 的 贴 图 在 virtual texture 中 的 位 置 只 要 把 物 体 贴 图 坐 标 绘 制 在 屏 幕 上 再 把 屏 幕 内 容 取 下 来, 逐 点 判 断, 就 能 够 得 到 本 帧 到 底 需 要 哪 些 page 来 绘 制 详 细 一 点 的 解 释 : 因 为 所 有 物 体 只 使 用 virtual texture 这 么 一 张 贴 图 那 么 物 体 贴 图 坐 标 肯 定 是 全 局 唯 一 的 ( 物 体 使 用 的 贴 图 肯 定 分 散 在 virtual texture 的 不 同 部 分 ) 我 们 把 物 体 贴 图 坐 标 当 成 顶 点 颜 色, 绘 制 一 遍 物 体, 那 么 屏 幕 上 的 像 素 就 代 表 了 这 些 物 体 的 每 个 像 素 的 贴 图 坐 标 ( 这 里 需 要 一 点 光 栅 化 的 知 识 在 绘 制 三 角 形 时, 顶 点 上 的 颜 色 作 为 填 充 三 角 形 的 颜 色, 被 光 栅 化 插 值 为 三 角 形 扫 描 线 中 每 个 像 素 的 RGB 值 ) 换 句 话, 屏 幕 上 绘 制 出 来 的 就 是 绘 制 物 体 每 个 像 素 要 用 到 的 贴 图 坐 标 同 时 在 光 栅 化 时, 我 们 在 pixel shader 中 还 可 以 计 算 出 每 个 像 素 用 到 贴 图 采 样 的 mipmap 层 级 数 ( 如 果 这 里 不 懂 可 以 先 复 习 一 下 光 栅 化 ) 最 后 把 这 个 结 果 输 出 为 一 张 图 片 由 CPU 去 分 析 这 里 给 出 图 片 可 能 的 样 子 :
环 状 不 同 颜 色 代 表 不 同 mipmap 这 个 东 西 在 id software 的 介 绍 中, 叫 Feedback Buffer 下 面 是 RAGE 中 的 样 子 接 下 来 就 容 易 了, 得 到 屏 幕 上 的 所 有 像 素 逐 一 分 析 每 个 像 素 的 信 息 就 是 对 应 物 体 所 用 到 贴 图 page 的 位 置 信 息 和 mipmap 级 数 这 个 级 数 也 用 来 定 位 page 的 位 置 分 析 完 毕, 我 们 就 有 了 当 前 屏 幕 上 所 有 景 物 要 用 到 的 pages 我 们 把 本 帧 需 要 用 到 的 page, 叫 活 跃 page 1680x1080 的 屏 幕 上, 像 素 个 数 是 1814400 个 每 个 像 素 都 检 查 一 遍,CPU 基 本 就 废 掉, 不 用 做 其 他 事 情 了 优 化 的 办 法 是 对 屏 幕 buffer 做 down sample 也 就 是 缩 小 屏 幕 pbuffer 尺 寸 只 检 查 有 限 的 像 素 或 者 干 脆 直 接 在 一 个 分 辨 率 很 小 的 pbuffer 上 绘 制 整 个 场 景 诸 如 此 类 从 图 上 看,RAGE 用 的 是 一 张 分 辨 率 比 较 低 的 Feedback Buffer
3.2 读 入 贴 图 page 显 存 贴 图 (physical page texture) 更 新 知 道 要 用 到 哪 些 page 之 后, 就 从 磁 盘 读 入 进 来 其 中 用 到 的 各 种 streaming 优 化, 贴 图 压 缩 解 压 缩, 就 不 提 了 显 卡 中 维 护 一 张 真 正 最 后 渲 染 要 用 到 的 贴 图 我 们 叫 它 显 存 贴 图 或 者 物 理 页 贴 图 (physical page texture) 这 张 贴 图 边 长 是 page 尺 寸 的 整 倍 数 读 入 的 page 贴 图 方 块, 就 一 个 个 在 physical page texture 中 拼 接 起 来 ( 拼 接 的 时 候 每 个 page 周 围 还 需 要 留 条 边 大 家 都 知 道 显 卡 最 后 纹 理 映 射 时, 有 个 双 线 性 插 值 的 问 题 而 且 随 着 物 体 离 镜 头 越 远, 用 的 mipmap 不 同, 对 不 同 mipmap page 周 围 留 的 边, 还 有 粗 细 不 同 的 问 题 总 之 这 些 零 零 碎 碎 的 问 题 充 斥 着 megatexture 实 现 的 所 有 步 骤 ) 页 表 贴 图 (page table texture) 更 新 在 这 一 步 很 重 要 的 事 情, 还 需 要 更 新 一 张 贴 图 这 张 贴 图 叫 page table texture --- 页 表 贴 图 页 表 贴 图 大 致 的 做 法 是 这 样 我 们 准 备 一 张 virtual texture 的 微 缩 版 本 这 个 微 缩 版, 有 的 paper 叫 indirect texture, 有 的 paper 叫 page table texture 我 们 用 中 文, 叫 " 页 表 贴 图 " 页 表 贴 图 的 每 个 图 素, 对 应 着 virtual texture 中 相 应 位 置 的 page 图 素 内 容 就 是 对 应 page 在 显 存 贴 图 (physical page texture) 中 的 位 置 信 息 比 如 : 如 果 virtual texture 最 高 精 度 那 层 有 1024x1024 个 page, 那 么 页 表 贴 图 大 小 就 是 1024 x 1024 个 图 素 接 着 我 们 定 义 一 下 活 跃 page 活 跃 page 的 意 思, 是 说 凡 是 本 帧 需 要 绘 制, 并 从 virtual texture 被 拷 贝 到 显 存 贴 图 (physical page texture) 中 的 page, 都 要 被 标 记 为 活 跃 page 页 表 贴 图 (page table texture) 需 要 每 帧 更 新, 每 个 活 跃 page 对 应 在 页 表 贴 图 (page table texture) 位 置 的 图 素 内 容, 要 记 录 这 个 活 跃 page 在 显 存 贴 图 (physical page texture) 中 的 位 置 信 息 如 图 :
得 到 结 果 是 : 因 为 在 屏 幕 上 的 场 景, 会 有 mipmap 用 到 不 同 mipmap page 的 信 息, 也 记 录 在 页 表 贴 图 的 mipmap 中 如 图
显 存 贴 图 (physical page texture) 用 page 填 充 好 之 后, 更 新 完 page table teture 就 可 以 用 这 两 张 贴 图 最 后 渲 染 了 3.3, 渲 染 到 这 个 阶 段, 我 们 已 经 实 现 了 megatexture 的 大 部 分 目 标, 挑 选 一 帧 中 能 够 看 到 的 物 体
用 到 的 贴 图, 拼 起 来 这 样 我 们 就 实 时 创 建 了 一 张 贴 图, 这 张 贴 图 上 面 只 有 本 帧 需 要 绘 制 在 屏 幕 上 的 贴 图 图 素 ( 当 然 肯 定 有 一 些 冗 余 ) 那 么 如 何 绘 制? 因 为 我 们 用 pages 拼 凑 而 成 的 这 张 显 存 贴 图 (physical page texture), 即 便 是 相 同 物 体 用 到 的 贴 图, 也 都 是 一 个 个 被 切 成 小 方 块 的 page 拼 凑 而 成 page 与 page 之 间 根 本 不 挨 着 不 同 mipmap 的 page 也 都 并 列 排 在 显 存 贴 图 里 根 本 不 连 续 用 这 唯 一 一 张 贴 图 去 绘 制 场 景 所 有 物 体 需 要 额 外 步 骤 纹 理 映 射 的 原 理 是 根 据 一 个 像 素 的 贴 图 坐 标 ( 注 意 这 里 是 已 经 被 光 栅 化 后 的 像 素 级 贴 图 坐 标 了 ), 去 贴 图 中 采 样 图 素 (texel) 这 个 图 素 的 颜 色 值, 经 过 光 照 处 理, 就 可 以 直 接 显 示 在 屏 幕 像 素 上 用 page 拼 凑 而 成 的 显 存 贴 图 (physical page texture) 正 确 显 示 场 景 中 所 有 物 体, 需 要 对 贴 图 坐 标 ( 物 体 贴 图 坐 标 是 在 virtual texture 贴 图 空 间 中 的, 直 接 用 这 个 贴 图 坐 标 去 索 引 显 存 贴 图 (physical page texture), 得 不 到 正 确 结 果 ) 进 行 一 下 转 换 使 得 显 示 在 屏 幕 上 物 体 的 每 个 像 素, 精 确 的 对 应 到 显 存 贴 图 (physical page texture) 上 它 应 该 对 应 的 位 置 我 们 需 要 一 次 像 素 级 别 的 贴 图 坐 标 转 换 这 个 任 务 可 以 用 indirect texture sampler 也 就 是 间 接 贴 图 采 样 来 完 成 即, 先 利 用 原 始 贴 图 坐 标, 对 一 张 间 接 贴 图 进 行 采 样, 得 到 一 些 必 要 信 息 后, 再 利 用 这 些 信 息 对 原 始 的 贴 图 坐 标 进 行 转 换 以 采 集 显 存 贴 图 这 个 间 接 贴 图, 其 实 就 是 页 表 贴 图 (page table texture) 以 下 是 过 程 简 述 : 1) 用 更 新 后 的 页 表 贴 图 (page table texture) 与 显 存 贴 图 (physical page texture) 共 同 绘 制 场 景 所 有 物 体 2) 在 pixel shader 中 进 行 一 次 贴 图 坐 标 间 接 寻 址 从 页 表 贴 图 (page table texture) 中 得 到 一 个 偏 移 值 用 这 个 偏 移 值 对 原 始 贴 图 坐 标 (virtual texture 贴 图 坐 标 ) 进 行 处 理, 就 变 为 最 终 需 要 采 样 显 存 贴 图 (physical page texture) 的 贴 图 坐 标 3) 用 处 理 过 的 贴 图 坐 标 采 样 显 存 贴 图 最 后 场 景 中 的 物 体 就 都 按 照 实 际 需 求 绘 制 出 来 了 如 图 : 这 张 图 只 是 一 个 示 意 图 图 4 实 际 屏 幕 显 示 红 点 的 位 置, 通 过 贴 图 坐 标 和 光 栅 化 我 们 可
以 知 道 在 virtual texture 上 采 样 的 位 置 ( 图 1 中 的 红 点 ) 用 这 个 红 点 的 贴 图 坐 标, 去 采 样 页 表 贴 图 (page table texture, 图 2), 得 到 了 当 前 活 跃 page 在 显 存 贴 图 中 的 位 置 换 算 关 系 红 点 在 图 2 落 到 了 内 容 为 3 的 图 素 里 利 用 这 个 换 算 关 系, 可 以 得 到 最 终 贴 图 坐 标 在 图 3 中, 正 确 的 对 显 存 贴 图 (physical page texture) 进 行 采 样 图 3 的 红 点 就 是 需 要 正 确 采 样 的 位 置 最 终 得 到 图 4 像 素 的 颜 色 值 4, 镜 头 快 速 转 动 与 移 动 时 经 过 3 个 步 骤, 如 果 硬 盘 无 限 快 速, 而 且 显 存 贴 图 (physical page texture) 的 大 小 能 够 满 足 绘 制 本 帧 所 有 物 体 最 大 精 度 贴 图 那 么 我 们 会 看 到 一 个 无 限 大 的 世 界, 有 着 最 高 贴 图 精 度 流 畅 地 在 眼 前 飘 过 事 实 上, 没 有 这 么 理 想 的 情 况 磁 盘 速 度 不 可 能 那 么 快 显 存 贴 图 (physical page texture) 有 时 候 并 不 满 足 绘 制 当 前 镜 头 中 所 有 物 体 最 大 精 度 贴 图 的 容 量 这 就 是 我 们 在 实 际 RAGE 游 戏 运 行 过 程 中 看 到 的 景 象 一 旦 摇 动 一 下 镜 头, 所 有 物 体 的 贴 图 都 重 新 回 到 最 模 糊, 然 后 慢 慢 变 得 精 细 这 个 现 象 在 PS3 上 尤 其 严 重 PS3 的 IO 是 严 重 瓶 颈 理 论 上 就 无 法 保 证 足 够 量 的 精 细 贴 图 在 一 定 时 间 内 读 入 显 存 在 一 个 光 驱, 硬 盘, 内 存, 显 存 的 4 级 cache 系 统 中, 任 何 一 个 地 方 的 瓶 颈 足 以 毁 灭 megatexture 美 好 的 初 衷 这 是 为 什 么 回 顾 virtual texture 技 术 的 3 个 步 骤 如 果 磁 盘 是 瓶 颈, 很 多 活 跃 page 无 法 从 磁 盘 调 入 显 存 那 么 显 存 贴 图 (physical page texture) 就 无 法 在 足 够 时 间 内 拼 凑 出 绘 制 当 前 场 景 所 需 要 的 全 部 贴 图 page 怎 么 办 这 个 时 候 有 很 多 办 法 可 想 一 个 最 简 单 的 办 法 是, 没 有 贴 图 的 景 物, 就 绘 制 个 马 赛 克 贴 图 好 了 当 然, 商 业 产 品 不 能 这 么 做 如 果 调 入 高 精 度 贴 图 来 不 及, 那 么 就 先 把 最 低 精 度 的 贴 图 调 入 进 来 如 果 最 低 精 度 都 进 不 来, 那 么 卡 帧, 让 用 户 休 息 一 下 从 这 里 看 出,megatexture 受 硬 件 制 约 依 旧 较 大 只 不 过 从 明 确 的 显 存 上 限, 降 低 到 对 IO 速 度 的 一 定 要 求 IO 速 度 对 于 PC, 可 能 越 来 越 快 对 于 XBOX360, 卡 马 克 爱 不 释 手 自 然 会 量 身 定 做 至 于 PS3, 那 就 算 那 些 买 正 版 的 家 伙 们 倒 霉 了 5, 一 些 问 题 另 外 一 种 情 况, 当 前 帧 的 场 景 中 物 体 太 多 了, 所 用 到 的 贴 图 总 量, 超 过 了 显 存 贴 图 (physical page texture) 容 量 很 多 物 体 都 没 有 贴 图 来 绘 制 自 然 只 能 空 在 那 里 解 决 方 案 无 非 就 是 尽 量 合 理 的 把 场 景 中 物 体 用 到 的 贴 图 量 控 制 一 下 这 里 面 要 解 决 的 工 程 问 题 无 限 多 要 自 研 此 技 术 做 产 品 的 人, 只 能 自 求 多 福 了 还 有 一 个 问 题 在 第 一 步 用 页 表 贴 图 (page table texture) 绘 制 时, 页 表 贴 图 是 一 张 完 整 调 入 显 卡 显 存 的 贴 图 它 是 virtual texture 的 缩 小 版 根 据 page 的 大 小 来 缩 小 一 个 page 相 当 于 这 个 贴 图 的 一 个 像 素 但 是 当 virtual texture 中 page 数 量 太 多, 以 至 于 页 表 贴 图 (page table
texture) 的 大 小 都 超 标 了, 这 就 是 个 很 麻 烦 的 事 了 我 们 假 设 一 个 page 512x512 像 素 (page 大 小 的 制 定 也 有 讲 究, 不 细 表 ) 如 果 想 要 在 页 表 贴 图 (page table texture) 保 持 在 4096x4096 大 小, 那 么 我 们 的 一 张 virtual texture 最 大 边 长 只 能 是 4096x512 像 素 也 就 是 这 张 virtual texture 最 大 也 就 2097152 x 2097152 像 素 大 小 一 个 像 素 算 4 字 节 那 么 最 大 的 一 张 图 容 量 是 4096 G 难 道 我 们 与 时 俱 进 的 玩 家 就 按 么 容 易 满 足 4T 的 贴 图 容 量 么? 随 着 祖 国 日 新 月 异 国 富 民 强, 人 民 群 众 的 审 美 娱 乐 需 求 一 日 提 高, 早 晚 有 一 天 如 果 真 有 这 种 情 况, 用 多 张 页 表 贴 图 是 一 种 自 然 的 选 择 同 时 还 存 在 其 它 问 题 比 如 浮 点 贴 图 坐 标 的 精 度 问 题 显 卡 内 部 对 贴 图 坐 标 浮 点 精 度 的 处 理 和 标 准 IEEE 单 精 浮 点 标 准 是 不 一 样 的 另 外,page table texture 是 一 张 用 来 索 引 贴 图 坐 标 的 贴 图, 这 张 贴 图 本 身 的 内 容 就 是 贴 图 坐 标, 所 以 也 需 要 用 浮 点 格 式 在 virtual texture 很 大 的 情 况 下, 各 种 buffer 各 种 贴 图 坐 标 浮 点 误 差 的 处 理, 也 令 人 头 疼 总 结 基 于 virtual texture 的 megatexture 技 术 充 斥 着 无 数 工 程 细 节 问 题 各 种 多 线 程 优 化 问 题 各 种 IO 优 化, 浮 点 误 差, 带 宽 瓶 颈 等 问 题 在 PC 上,ATI 显 卡 险 些 全 军 覆 没 也 暴 露 了 在 兼 容 性 方 面 的 问 题 其 它 还 有 技 术 与 工 具 集 生 产 流 水 线 的 集 成 问 题 等 id software 在 此 领 域 推 出 成 熟 技 术 解 决 方 案, 令 人 钦 佩 megatexture 解 决 了 静 态 纹 理 容 量 问 题 但 游 戏 的 表 现, 并 不 完 全 取 决 于 静 态 光 影 和 贴 图 细 致 度 在 ID TECH 6 中, 卡 马 克 打 算 用 voxel rendering 把 几 何 数 据 容 量 问 题 也 一 并 解 决 掉, 并 且 抛 弃 多 边 形 光 栅 化 渲 染, 带 玩 家 走 入 另 外 一 个 细 节 复 杂 度 无 限 高 的 虚 拟 现 实 世 界 我 们 可 以 拭 目 以 待 2011-10 PS. H3D2 Engine 这 几 年 公 司 开 发 了 一 款 新 的 游 戏 引 擎 采 用 了 延 迟 渲 染 和 前 向 渲 染 混 合 的 管 道 准 备 开 发 公 司 下 一 代 的 产 品 由 于 产 品 在 艺 术 表 现 方 面 的 一 些 特 殊 需 求, 引 擎 工 具 主 要 在 于 营 造 逼 真 的 舞 台 艺 术 效 果 demo 中 有 100 多 盏 实 时 光 源 延 迟 着 色 给 美 术 带 来 的 便 利 在 于 不 再 受 到 实 时 光 源 限 制, 可 以 用 多 钟 光 源 任 意 营 造 想 要 的 效 果 次 世 代 图 像 技 术 正 在 慢 慢 改 变 3D 游 戏 图 形 开 发 的 性 质 使 之 成 为 一 种 更 接 近 一 种 用 技 术 创 造 艺 术 的 过 程 特 效 美 术 成 为 了 舞 台 灯 光 设 计 师 角 色 美 术 也 必 须 肩 负 起 布 料 仿 真 的 效 果 编 辑
技 术 只 是 一 种 手 段, 创 造 一 些 带 有 艺 术 感 的 新 奇 东 西 是 件 很 有 意 思 的 事 情 截 图 视 频 等 信 息 在 : http://www.cnblogs.com/puzzy3d/archive/2011/05/04/2036327.html 视 频 http://h3d.com.cn/downloads/h3d2_engine-run.mp4