ID Tech 5 中 "Megatexture" 针 对 地 形 的 D3D9 基 本 实 现 原 理 姚 勇 H3D 2007-8 本 文 对 ID SOFTWARE 使 用 的 "megatexture" 技 术, 针 对 地 表 贴 图 应 用 的 D3D9 的 硬 件 实 现, 做 了 概 要 式 的 介 绍 并 对 技 术 的 实 现, 优 化, 扩 展, 和 实 用 性 进 行 了 刨 析 转 载 请 注 名 作 者 和 H3D 一, 综 述 ID TECH5 是 PC 3D 游 戏 之 父 和 DOOM 之 父 John Carmack 最 新 推 出 的 一 项 新 的 游 戏 制 作 技 术 核 心 内 容 为 一 种 命 名 为 "Megatexture" 的 动 态 贴 图 管 理 技 术 实 际 上 是 一 种 动 态 卸 载 和 装 载 渲 染 资 源 的 技 术 统 称 Idsoftware DOOM3 引 擎 的 lighting/shadow/shader 方 案 统 一 以 后, 同 UNREAL3 一 样, 面 对 次 世 代 游 戏 对 资 源 的 无 穷 尽 需 求, 需 要 尽 快 建 立 起 一 种 实 际 工 程 技 术 方 案, 加 快 构 建 3D 虚 拟 现 实 的 生 产 图 片 来 源 :Quake Wars 这 个 技 术 最 主 要 方 向 就 是 要 把 VR3D 建 造 从 有 限 的 显 卡 内 存 中 释 放 出 来 把 美 术 从 繁 重 的 贴 图 重 用 绘 制 中 解 脱 出 来 因 为 VR3D 主 要 资 源 消 耗 都 在 贴 图 上, 所 以 这 个 技 术 主 要 针 对
texture 同 时 geometry 也 可 以 作 为 动 态 资 源 一 旦 rendering 相 关 资 源 作 为 动 态 流 进 行 管 理, 所 带 来 的 另 一 个 好 处 就 是 可 以 让 VR 世 界 变 为 动 态 的 随 时 改 变 texture/geometry 总 得 来 讲,ID 这 项 针 对 工 程 应 用 技 术 主 要 致 力 于 解 决 :1-3DVR 资 源 需 求 的 爆 炸 增 长 和 有 限 显 卡 显 存 的 矛 盾 ;2- 美 术 资 源 需 求 的 爆 炸 增 长, 以 及 生 产 力 低 成 本 高 昂 的 矛 盾 在 ID TECH5 演 示 中, 实 时 演 算 播 放 了 一 个 细 节 非 常 丰 富 的 室 外 地 形, 同 时 结 合 了 一 个 小 型 的 室 内 场 景 所 有 模 型 和 贴 图 制 作, 按 照 Carmack 介 绍, 只 让 几 个 美 术 花 了 4 天 时 间 就 制 作 出 20G 的 游 戏 美 术 资 源 而 游 戏 引 擎 负 责 把 几 十 G 的 资 源 动 态 装 载 到 显 卡 进 行 渲 染 本 文 就 以 下 几 个 问 题 做 初 步 讲 述 :1, 综 述 地 形 渲 染 以 及 贴 图 技 术 ;2,Clipmap 介 绍 ; 3, 基 于 D3D9 的 解 决 方 案 描 述 ;4, 优 化 和 扩 展 ;5, 方 案 可 行 性 1-1,Mega Texture 如 下 : Megatexture 的 具 体 实 现, 在 DOOM3 中 的 地 形 绘 制 已 经 加 入 具 体 实 现 细 节 简 单 描 述 DOOM3 的 地 形 贴 图 最 大 支 持 32768x32768 即 5.46 G 在 DOOM3 中, 以 128x128 大 小 的 块 进 行 储 存 便 于 快 速 读 取 以 最 大 2048x2048 的 clipmap 尺 寸 进 行 处 理 其 实 可 以 计 算 出 在 D3D9 标 准 的 显 卡 上,normalmap+6 clipmap stack 的 最 大 理 论 支 持 贴 图 数 据 大 小 为 (2048 * 2^6 )^2 *4= 68T bytes. 这 个 大 小 针 对 现 在 的 PC 硬 盘 是 绰 绰 有 余 的 DOOM3 使 用 这 张 全 局 metatexture 纹 理 渲 染 地 形, 不 使 用 LOD,GEOM-MORPHING 1-2, 传 统 地 形 贴 图 渲 染 当 使 用 Tiling 方 式 绘 制 贴 图, 等 于 把 贴 图 图 素 (texel) 密 度 成 倍 扩 大 以 重 复 纹 理 信 息 量 的 代 价 保 证 在 一 定 分 辨 率 下 屏 幕 上 贴 图 的 精 细 程 度 在 绘 制 大 范 围 地 形 时, 使 用 不 Tiling 的 全 局 贴 图 无 法 表 现 贴 地 处 的 地 表 细 节 所 以 使 用 一 些 可 以 重 复 (Tiling) 的 不 规 则 图 案 的 贴 图 来 进 行 模 拟 1-2-1 Tiling 地 形 贴 图 由 于 地 形 贴 图 尺 寸 很 大, 所 以 无 法 使 用 全 局 贴 图 而 是 把 多 层 Tiling 的 纹 理 使 用 alpha 通 道 互 相 融 合 起 来 诸 如 WOW[1], 天 堂 2 等 大 型 室 外 地 形 渲 染 多 采 用 此 技 术 此 技 术 在 每 一 层 Tiling 贴 图 依 然 用 到 了 一 张 全 局 alpha 贴 图 以 及 一 张 全 地 形 唯 一 的 静 态 光 影 贴 图 在 multitexture 中 根 据 显 卡 的 multitexture 处 理 单 元 数 量, 进 行 multi-pass 和 multitexture 的 混 合 渲 染 比 如, 混 合 绿 草, 土 路, 野 花 的 一 块 室 外 地 形, 需 要 至 少 3 层 地 表 贴 图 分 别 是 一 块 256x256 的 草 贴 图,128x128 的 土 路 贴 图, 和 128x128 的 野 花 贴 图 每 层 纹 理 使 用 Tiling 模 式 进 行 绘 制, 在 绘 制 的 同 时, 每 层 纹 理 带 有 一 张 ALPHA 灰 度 图 ( 第 一 层 不 用 ) 用 来 表 明 本 层 纹 理 在 融 合 中 所 占 的 比 重 把 3 张 地 表 贴 图,2 张 ALPHA 贴 图, 以 及 一 张 LIGHTMAP 贴 图 混 合 起 来, 就 有 如 下 地 表 效 果 可 以 看 出 土 路 和 草 地 之 间 的 均 匀 过 渡
图 片 来 源 :H3D 如 果 进 行 优 化,4 层 ALPHA 可 以 混 合 称 为 一 张 贴 图 Lightmap 一 张 那 么 也 至 少 需 要 2 张 全 局 贴 图 进 行 地 表 绘 制 1-2-2 全 局 地 表 纹 理 混 合 Tiling 细 节 贴 图 [2] 在 更 大 广 度 的 地 形 渲 染, 有 时 候 需 要 一 种 更 加 快 速 的 方 法 在 FAR CRY 引 擎 中, 使 用 了 这 个 技 术 简 单 描 述 为, 使 用 一 张 全 局 地 表 纹 理, 渲 染 地 表 所 有 植 被 和 光 影 信 息 在 离 视 点 近 的 范 围 内, 使 用 一 张 表 现 当 地 地 表 细 节 的 贴 图, 以 Tiling 方 式 进 行 融 合 叠 加 这 样 在 细 节 度 上, 以 Tiling 方 式 的 贴 图 以 高 细 节 图 素 纹 理, 掩 盖 了 下 面 那 一 层 全 局 贴 图 的 粗 糙 颗 粒 总 的 来 讲, 分 层 Tiling Alpha 混 合 地 表 贴 图, 和 全 局 地 表 混 合 Tiling 细 节 贴 图, 两 种 方 法 都 是 靠 贴 图 的 Tiling 来 增 大 视 点 附 近 贴 图 图 素 的 密 度 防 止 比 屏 幕 分 辨 率 小 的 2 图 素 之 间 进 行 线 性 差 值 影 响 真 实 感 二,Clip maps 基 本 介 绍 针 对 受 显 卡 显 存 制 约, 无 法 使 用 大 尺 寸 贴 图 进 行 绘 制,1998 年 SGI 公 司 发 表 了 一 篇 名 为 <The Clipmap: A Virtual Mipmap>[3] 的 论 文 论 文 里 详 细 阐 述 了 一 种 以 有 限 硬 件 性 能, 来 实 现 相 对 无 限 大 贴 图 的 渲 染 论 文 是 一 整 套 硬 件 与 软 件 结 合 的 方 案 它 可 以 实 现 以 一 平 方 米 一 个 图 素, 用 单 一 贴 图 进 行 整 个 地 球 表 面 的 渲 染 并 且 结 合 硬 件 数 据 传 输 带 宽, 以 及 相 应 优 化 方 法, 鲁 棒 的 保 证 以 任 意 速 度 漫 游 时 保 持 在 60Hz( 针 速 率 ) 下 面 先 对 此 技 术 做 一 定 简 要 介 绍 在 第 三 节 给 出 基 于 D3D9 硬 件 的 解 决 方 案 思 路 下 图 为 Clipmap 实 现 的 美 国 国 家 地 图 实 时 漫 游 的 一 小 部 分 美 国 约 塞 米 蒂 国 家 公 园 (Yosemite National Park) 南 部 的 一 半 整 个 美 国 使 用 一 张 170G 的 贴 图 在 显 卡 中 的 clipmap 贴 图 缓 存 为 16M 这 个 贴 图 内 存 用 量 在 今 天 的 PC 硬 件 上 是 完 全 可 以 实 现 的
图 片 来 源 :<The Clipmap: A Virtual Mipmap> 2-1,Mipmap 工 作 原 理 及 其 分 析 我 们 先 从 mipmap[4] 工 作 原 理 分 析 开 始 如 图 : 图 片 来 源 :<The Clipmap: A Virtual Mipmap> Mipmap 的 工 作 原 理 是, 把 一 张 贴 图 按 照 2 的 倍 数 进 行 缩 小 直 到 1X1 把 缩 小 的 图 都 储 存 起 来 在 渲 染 时, 根 据 一 个 象 素 (pixel, 注 意 pixel 和 texel 区 别 Pixel 是 屏 幕 上 一 个 点 Texel 是 贴 图 上 一 个 图 素 ) 离 眼 睛 位 置 的 距 离, 来 判 断 从 一 个 合 适 的 图 层 中 取 出 texel 颜 色 赋 给 象 素 D3D 和 OGL 都 有 想 对 应 的 API 控 制 接 口 如 下 图
图 片 来 源 :<The Clipmap: A Virtual Mipmap> 通 过 观 察 mipmap 工 作 原 理 我 们 可 以 发 现, 硬 件 总 是 根 据 眼 睛 到 目 标 的 距 离, 来 选 取 最 适 合 当 前 屏 幕 象 素 分 辨 率 的 图 层 假 设 有 一 张 32768x32768 mipmap 贴 图 当 前 屏 幕 分 辨 率 为 1024 1024 眼 睛 距 离 物 体 比 较 近 时,mipmap 最 大 也 只 可 能 从 1024 1024 的 mipmap 图 层 选 取 texel 再 次, 当 使 用 三 线 性 过 滤 (trilinear) 时, 最 大 也 只 访 问 到 2048x2048 的 图 层 选 取 texel, 来 和 1024x1024 图 层 中 的 图 素 进 行 线 性 插 值 这 样 一 个 基 本 事 实 告 诉 我 们, 在 使 用 任 何 尺 寸 贴 图 渲 染 任 意 距 离 的 物 体 时, 贴 图 采 样 只 会 用 到 不 大 于 屏 幕 分 辨 率 2 倍 的 mipmap 层 根 据 这 个 事 实, 我 们 可 以 创 建 clipmap 对 大 尺 寸 贴 图 进 行 渲 染 时 的 优 化 2-2,Clipmap 原 理 2-2-1 Clipmap 构 建 在 原 始 clipmap 论 文 中,clipmap 在 显 卡 内 存 中 的 构 建 如 图 : 图 片 来 源 :<The Clipmap: A Virtual Mipmap> Clipmap Pyramid(clipmap 棱 椎 ) 是 我 们 PC 显 卡 中 常 见 的 mipmap 形 式 Clipmap Stack 是 不 同 于 mipmap 实 现 的 地 方 横 线 绘 制 的 棱 锥 代 表 完 整 贴 图 的 mipmap 形 式 但 是 在 显 存 中, 大 于 clipmap Pyramid 最 高 层 尺 寸 的 贴 图, 都 以 clipmap pyramid 尺 寸 存 放, 但 是 相 应 的, clipmap stack 中 的 贴 图 代 表 的 原 始 贴 图 面 积, 一 层 比 一 层 小 比 如 clipmap pyramid 最 大 2048x2048 在 之 上 一 层,mipmap 表 达 是 4096x4094 图 素 在 clipmap stack 中, 还 是 储 存 2048x2048 大 小 的 贴 图 显 然 此 代 表 的 就 是 mipmap 尺 寸 4096 的 一 半 边 长, 即 原 始 面 积 的 1/4 大 小 依 次 推 上 去, 每 层 都 是 下 层 代 表 面 积 的 1/4 Clipmap pyramid 最 大 边 长 即 为 Clipsize size Clipmap 贴 图 的 中 心 点, 在 整 张 贴 图 的 位 置 坐 标, 我 们 称 为 ClipCenter ClipCenter 由 当 前 摄 像 机 在 整 个 世 界 中 的 相 对 位 置 来 决 定 实 际 中, 目 前 D3D9 级 别 的 PC 显 卡 硬 件 并 不 支 持 这 种 储 存 形 式 的 mipmap 具 体 实 现 方 法 将 在 第 三 章 讲 解
2-2-2 渲 染 Clipmap 在 渲 染 中, 针 对 一 个 Pixel, 根 据 当 前 Pixel, 找 到 相 应 的 clipmap 层, 如 果 处 于 clipmap pyramid, 直 接 按 照 mipmap 传 统 方 式 采 样 取 图 素 如 果 处 于 clipmap stack, 则 把 贴 图 坐 标 根 据 当 前 clipmap stack 代 表 整 体 面 积 的 比 例, 进 行 缩 放, 得 到 对 应 位 置 图 素 这 样 就 可 以 正 确 渲 染 屏 幕 上 的 任 意 物 体 如 下 图 : 图 片 来 源 :<The Clipmap: A Virtual Mipmap> 把 CLIPMAP 所 有 图 层 绘 制 出 来, 从 正 上 方 看, 就 是 象 北 京 二 环 内, 二 环, 三 环, 四 环 为 分 割 绘 制 中 心 区 域 的 贴 图 分 辨 率 最 大, 但 是 代 表 的 面 积 最 小 绘 制 最 外 围 四 环 之 外 的 贴 图 分 辨 率 最 小 是 因 为 到 了 clipmap pyramid 层, 一 层 就 代 表 一 张 全 局 贴 图 但 是 分 辨 率 已 经 被 缩 小 了 很 多 倍 而 分 辨 率 最 大 的 clipmap stack 顶 层, 由 于 尺 寸 必 须 保 持 clipmap pyramid 的 最 大 尺 寸, 所 以 所 代 表 的 面 积 就 小 了 很 多 这 种 折 中 正 是 由 于 基 于 绘 制 屏 幕 上 的 任 何 物 体 都 不 可 能 使 用 大 于 屏 幕 分 辨 率 的 贴 图 尺 寸, 所 以 在 显 存 中 只 提 供 刚 刚 满 足 绘 制 在 一 针 内, 从 一 个 视 点 看 过 去 的 所 有 场 景 ( 地 形 ) 分 辨 率 的 贴 图 内 容 2-2-3 climap LOD 计 算 以 及 每 层 贴 图 坐 标 计 算 给 定 一 个 根 据 ClipCenter 换 算 过 的 贴 图 坐 标, 下 面 需 要 计 算 出 在 屏 幕 上 的 一 个 物 体 的 象 素, 从 clipmap 中 选 取 一 层, 索 引 贴 图 图 素 由 mipmap LOD(LOD 数 在 本 文 用 俗 称 层 数 描 述 ) 计 算 公 式 得 知,clipmap LOD 计 算 和 mipmap 一 样 并 且 可 以 保 证 任 意 pixel 计 算 出 来 的 climap 层 必 然 落 在 clipmap stack 中 一 般 PC 3D 显 卡 硬 件 计 算 都 采 用 Heckbe 算 法 简 单 描 述 如 下 : LOD = log2[f(x, y)]; f(x,y) 为 屏 幕 x,y 轴 方 向 贴 图 坐 标 变 化 率 的 最 大 值 贴 图 坐 标 变 化 率 计 算 由 屏 幕 象 素 X,Y 坐 标 分 别 递 进 一 个 象 素 单 位 的 变 化 投 影 到 贴 图 坐 标 系 得 出 具 体 描 述 参 考 [5] 2-3,, 存 储 效 率 Clipmap 由 于 采 用 clipmap stack 和 clipmap pyramid 结 合 的 方 式, 使 用 clipsize 为 2^m 的 clipmap, 把 一 张 2^n 边 长 贴 图 容 量 从 (4n+1-1)/3 字 节 下 降 为 4m(n - m + 4/3) - 1/3 字
节 更 具 体 的 数 据 如 下 : 类 型 / 边 长 512 1024 4096 32768 67108864 Full Mipmap 682KB 2.7MB 42.7MB 2.7GB 10923TB 512 Clipmap 682KB 1.1MB 2.2MB 3.7MB 9.1MB 1024 Clipmap 682KB 2.7MB 6.7MB 12.7MB 34.7MB 2048 Clipmap 682KB 2.7MB 18.7MB 42.7MB 131.7MB 可 见 clipmap 极 大 降 低 了 显 卡 内 存 对 渲 染 超 大 容 量 贴 图 的 要 求 目 前 D3D9 的 主 流 显 卡 从 128M 到 256M 不 等 在 1024 的 Clipsize 下, 几 乎 所 有 显 卡 都 可 以 满 足 要 求 2-4,, 绘 制 整 个 地 球 表 面 的 方 案 -- 虚 拟 clipmap( ( 简 述 ) 当 绘 制 国 家 或 者 星 球 表 面 这 样 规 模 的 实 时 渲 染 时, 整 张 贴 图 尺 寸 为 2^26 的 平 方 这 样 一 来, 需 要 在 显 卡 硬 件 内 部 计 算 的 工 作, 诸 如 贴 图 坐 标 换 算 等 都 难 以 在 精 度 为 IEEE 32 FLOAT 下 正 确 进 行 在 原 有 clipmap 基 础 上, 在 U,V 方 向 加 入 一 个 坐 标 偏 移 向 量 在 clipmap stack 的 纵 向 方 向, 加 入 一 个 偏 移 数 值 形 成 如 下 图 解 构 : 图 片 来 源 :<The Clipmap: A Virtual Mipmap> 系 统 只 要 能 够 保 证 从 图 中 的 3 种 情 况 中 正 确 寻 址, 就 能 够 保 证 超 大 贴 图 的 clipmap 渲 染 三, 基 于 D3D9 的 简 化 实 现 从 之 前 对 Clipmap 的 描 述 中 可 以 看 出 现 代 D3D9 显 卡 具 备 了 渲 染 clipmap 的 大 部 分 功 能 唯 一 欠 缺 的 是 clipmap stack 的 模 拟 因 为 clipmap pyramid 就 是 一 张 标 准 的 mipmap 贴 图 所 以 D3D9 只 要 能 够 把 clipmap stack 模 拟 出 来, 使 用 shader model3 可 以 很 容 易 的 实 现 clipmap 3-1,Multitexture 我 们 利 用 显 卡 硬 件 的 multitexture 模 拟 clipstack 这 是 D3D9 简 化 实 现 的 最 基 本 思 想 PC 显 卡 支 持 clip pyramid 在 pixel shader 中, 如 果 想 利 用 clipmap stack, 就 必 须 有 某 种 途 径 让 pixel shader 使 用 除 了 clip pyramid 之 外 的 贴 图 自 然 我 们 想 到 了 使 用 multitexture D3D9 标 准 显 卡 应 该 支 持 最 少 8 层 纹 理 单 元 ( 不 支 持 的 硬 件 很 快 会 绝 迹, 所 以 可 以 不 考 虑 ) 假 设
我 们 不 使 用 法 线 贴 图 进 行 凹 凸 象 素 光 照 使 用 第 8 层 装 载 clip pyramid, 使 用 2048x2048 32bit DDS 贴 图 从 第 一 层 到 第 七 层 我 们 都 可 以 使 用 clip stack 贴 图 这 样, 分 别 装 载 4096, 8192, 16384,32768,65536,131072,262144 边 长 mipmap 的 clipmap 每 一 层 占 用 2048x2048*4*/4*1.33 /1024 /1024 = 5.32Mb 这 样 一 共 8 层 贴 图 总 共 43MB 贴 图 显 存, 可 以 容 纳 一 张 274TB 的 贴 图 当 我 们 使 用 每 层 1024 1024 贴 图 时, 使 用 12MB 显 存 就 可 以 模 拟 68TB 的 贴 图 显 然 对 于 游 戏 来 讲 绰 绰 有 余 注 意 这 里 只 是 简 化 计 算, 没 有 把 trilinear 考 虑 进 去 3-2,Toroidal addressing 在 第 四 章 我 们 将 考 虑 优 化 和 动 态 管 理 clipmap 我 们 知 道 用 MULTITEXTURE 模 拟 的 clipmap 只 是 当 前 视 角 观 察 的 贴 图 用 量 当 摄 像 机 移 动 时,clipmap 的 贴 图 组 必 须 同 时 更 新 除 了 最 底 层 clipmap pyramid 贴 图 不 用 更 新, 其 他 几 张 clipmap stack 贴 图 必 须 根 据 摄 像 机 移 动, 改 变 ClipCenter 位 置 然 后 从 磁 盘 上 把 clipcenter 周 围 的 贴 图 调 入 这 涉 及 到 显 存 写 入 问 题 可 以 想 见 当 所 有 clipmap stack 贴 图 同 时 频 繁 装 载 总 共 十 几 MB 容 量 的 内 存, 对 于 磁 盘 IO 和 显 存 带 宽 都 是 极 大 考 验 所 以 针 对 clipmap 更 新 特 点, 在 贴 图 寻 址 方 面 采 用 wrap 循 环 寻 址 然 后 对 贴 图 的 更 新 采 用 如 下 方 式 : 图 片 来 源 :NVSDK 3-3,pixel shader 实 现 思 想 概 要 由 于 有 了 第 二 章 climpa 渲 染 的 大 概 描 述, 以 及 前 两 节 关 于 clipmap stack 和 贴 图 寻 址 方 式, 我 们 利 用 shader model 3 的 pixel shader 功 能 可 以 直 接 实 现 具 体 算 法 描 述 如 下 :
1, 计 算 mipmap LOD 2, 计 算 光 照 3, 假 如 应 该 采 样 clipmap pyramid, 直 接 采 样, 混 合 光 照, 完 成 4, 假 如 应 该 采 样 clipmap stack 贴 图, 重 新 计 算 贴 图 坐 标 5, 根 据 mipamaplod 选 择 相 应 的 stack 贴 图 采 样, 混 合 光 照, 完 成 首 先, 计 算 mipmap LOD 这 里 可 以 采 用 三 线 性 插 值 例 如 : PSOut PS_Trilinear(PSIn input) { PSOut output; float2 dx = ddx( input.texcoord * g_texturesize.x ); float2 dy = ddy( input.texcoord * g_texturesize.y ); float d = max( sqrt( dot( dx.x, dx.x ) + dot( dx.y, dx.y ) ), sqrt( dot( dy.x, dy.x ) + dot( dy.y, dy.y ) ) ); // 计 算 出 float miplevel = log2( d ); float blendglobal = saturate(g_stackdepth - miplevel); float4 color0 = PyramidTexture.Sample( samplerlinear, input.texcoord ); If (blendglobal)// 如 果 使 用 了 全 局 clipmap pyrimad, 及 早 退 出 { output.color = color0; } Else {// 使 用 了 clipmap stack 贴 图, 计 算 贴 图 坐 标, 然 后 动 态 分 支 判 断 应 该 采 样 第 几 层 贴 图 // This fractional part defines the factor used for blending // between two neighbour stack layers float blendlayers = modf(miplevel, miplevel); blendlayers = saturate(blendlayers); int nextmiplevel = miplevel + 1; nextmiplevel = clamp( nextmiplevel, 0, g_stackdepth - 1 ); miplevel = clamp( miplevel, 0, g_stackdepth - 1 ); layer ). // Here we need to perform proper scaling for input texture coordinates. // For each layer we multiply input coordinates by g_scalefactor / pow( 2, // We add 0.5 to result, because our stack center with coordinates (0.5, 0.5) // starts from corner with coordinates (0, 0) of the original image. float2 cliptexcoord = input.texcoord / pow( 2, miplevel ); cliptexcoord *= g_scalefactor;
// 只 是 简 单 的 双 线 性 采 样 if (miplevel==0) { //use clipstacktexture0.sample(...) } If (miplevel ==1) { //use clipstacktexture1.sample(...) } } Return output; } 3-4,D3D10 的 实 现 7 D3D10 引 入 了 一 种 叫 Texture Array 的 功 能 可 以 在 pixel shader 中 直 接 利 用 一 个 整 数 下 标 来 寻 找 所 需 要 的 贴 图, 然 后 进 行 采 样 思 路 同 上, 只 不 过 不 用 动 态 分 支, 直 接 进 行 数 组 索 引 后 采 样 图 片 来 源 :NVSDK 图 中 绿 色 部 分 就 是 texture array
四, 一 些 优 化 和 扩 展 Clipmap 在 显 存 中 的 存 在, 只 是 应 对 某 一 个 固 定 摄 像 机 位 置 和 角 度 的 场 景 贴 图 需 求 当 摄 像 机 移 动 时, 必 须 对 clipmap 贴 图 进 行 更 新 具 体 更 新 方 法 第 三 章 已 经 提 过 但 是, 在 摄 像 机 每 一 针 运 动 都 使 用 磁 盘 IO 和 阻 塞 渲 染 管 道 的 内 存 搬 运, 是 不 具 实 用 性 的 所 以 在 实 用 中, 必 须 对 clipmap 动 态 更 新 进 行 高 度 优 化 这 也 是 此 技 术 的 核 心 所 在 同 时, 对 clipmap 的 一 些 扩 展 是 为 了 增 强 游 戏 的 表 现 力 以 下 4-6 到 4-9 的 扩 展 方 面 没 有 进 行 任 何 实 际 论 文 和 实 例 支 持, 只 是 一 种 对 现 有 技 术 扩 充 的 预 想 和 估 计 希 望 专 家 给 与 更 深 入 的 建 议 4-1,, 动 态 clipmap 管 理 Clipmap 的 动 态 管 理, 必 须 满 足 几 个 条 件 1, 摄 像 机 移 动 时 的 平 滑 实 时 渲 染 ;2, 不 能 对 摄 像 机 的 移 动 速 度 和 位 置 有 所 限 制 ;3, 动 态 装 载 更 新 应 该 是 外 部 不 可 见, 自 动 进 行 的 4-2,2 级 cache 由 一 般 异 步 动 态 装 载 卸 载 应 用 技 术 得 知, 在 大 数 据 量 进 行 从 磁 盘 到 内 存 的 交 换 时, 必 须 有 足 够 的 缓 冲 由 于 磁 盘 到 内 存, 内 存 到 显 存 的 带 宽 大 不 一 样, 磁 盘 到 内 存 比 内 存 到 显 存 慢 得 比 较 多 所 以, 对 于 从 硬 盘 到 显 卡 内 存 的 缓 冲, 需 要 存 在 至 少 2 步 CACHE 第 一 步, 从 磁 盘 到 主 内 存 的 缓 冲 对 clipmap stack 贴 图 周 边 的 图 素, 必 须 预 先 读 入 一 些 到 主 存 CACHE 中 来 并 且 这 个 动 作 应 该 在 整 个 游 戏 期 间 保 持 不 停 顿 预 先 读 入 的 数 据 根 据 玩 家 移 动 方 向 做 一 定 预 测 在 模 拟 星 球 表 面 的 海 量 贴 图 库 中 进 行 更 新, 同 时 还 要 考 虑 不 同 磁 盘 阵 列 相 应 速 度 等 等 所 以 磁 盘 到 主 存 的 缓 冲 策 略 非 常 重 要 第 二 步, 从 主 存 装 入 内 存, 每 次 更 新 每 个 clipmap stack 贴 图 周 边 的 半 圈 贴 图 内 容 图 片 来 源 :<The Clipmap: A Virtual Mipmap> 棕 色 区 域 是 每 次 更 新 的 内 容 4-3, 多 线 程 IO 控 制 在 主 循 环 中 对 贴 图 进 行 磁 盘 IO, 解 压, 然 后 写 入 clipmap stack 贴 图 缓 存, 会 同 时 阻 碍 CPU 和 GPU 的 工 作 流 水 线 使 得 处 理 器 停 滞, 影 响 效 率 所 以, 对 磁 盘 到 主 存 的 读 取 IO, 解 压 工 作, 可 以 放 在 另 外 一 个 线 程 中 进 行 写 入 贴 图 显 存 的 工 作 由 于 本 身 会 阻 断 D3D9 级 别
显 卡 的 流 水 线 但 是, 可 以 利 用 一 些 策 略 延 缓 一 次 性 装 入 所 有 CLIPMAP STACK 贴 图 的 并 发 这 将 在 4-6 讲 解 4-1 中 提 到 的 摄 像 机 平 滑 移 动 渲 染, 主 要 是 指 对 clipmap stack 贴 图 更 新 的 步 骤 一 定 要 短, 不 能 极 大 幅 度 影 响 主 渲 染 循 环 的 执 行 在 固 定 带 宽 内, 对 clipmap stack 贴 图 边 带 更 新 的 数 据 量 并 不 很 大 基 本 可 以 保 持 一 个 平 滑 渲 染 的 过 程 在 WINDOWS 系 统, 使 用 无 缓 冲 的 异 步 IO 模 式 是 最 适 合 此 应 用 的 且 文 件 以 硬 盘 簇 大 小 的 整 数 倍 放 置, 读 取 效 率 最 快 4-4, 使 用 MaxTextureLOD 在 4-1 中 提 到, 摄 像 机 以 任 意 速 度 移 动, 都 不 能 影 响 渲 染 的 平 滑 我 们 采 用 如 下 策 略 1, 当 摄 像 机 以 设 计 速 度 移 动 时,clipmap 正 常 更 新 2, 当 摄 像 机 超 过 设 计 速 度,clipmap 更 新 速 度 无 法 赶 上 摄 像 机 移 动 速 度 则 自 动 调 整 max texture LOD Max texture LOD 的 意 义 是 clipmap 工 作 在 最 高 clipmap stack 的 贴 图 层 数 这 个 参 数 同 时 影 响 clipmap upload 和 渲 染 pixel shader 中 stack 选 取 降 低 最 高 细 节 stack 意 味 着 降 低 climap update 的 负 荷 3 当 出 现 极 端 情 况 时, 所 有 clip stack 更 新 都 赶 不 上 camera 移 动, 则 只 使 用 clipmap pyramid 贴 图 进 行 渲 染 虽 然 图 象 贴 图 分 辨 率 急 剧 下 降, 但 是 保 证 了 camera 以 任 意 速 度 漫 游 4-5,, 对 地 形 几 何 渲 染 扩 展 --geometry clipmap 参 考 GPU GEMS2 的 geometry clipmap 介 绍 文 章 6 简 单 描 述 为 : 使 用 clipmap 进 行 顶 点 生 成 把 高 度 图 做 为 clipmap 进 行 更 新, 然 后 做 为 vertex texture 的 源 用 以 生 成 地 形 网 格 这 么 做 的 好 处 是, 地 形 网 格 削 减 被 放 入 了 climap 的 LOD 过 程 中 而 不 用 CPU 做 任 何 额 外 计 算 工 作 并 且 支 持 相 对 无 限 大 地 形 动 态 地 形 改 变 4-6,double clipmap buffer,, 无 效 边 带 4-3 指 出, 使 用 多 线 程 把 磁 盘 IO 和 解 压 缩, 可 以 促 进 CPU 和 GUP 协 同 工 作 在 对 磁 盘 文 件 进 行 预 读 取 时 有 着 极 大 好 处 在 对 JPEG 进 行 分 块 读 取 和 REALTIME 解 压 缩 时, 可 以 在 多 核 系 统 上 获 得 额 外 的 负 载 减 轻 Clipmap 原 先 的 设 计, 存 在 一 个 叫 无 效 边 带 的 技 术 它 可 以 使 得 SGI 硬 件 底 层 一 边 渲 染 一 边 进 行 边 带 的 贴 图 更 新 等 于 是 主 存 到 显 存 的 第 0 级 CACHE PC 和 有 的 CONSOLE 显 卡 不 具 备 这 样 的 功 能 对 于 写 入 显 存 操 作, 都 是 把 一 张 贴 图 显 存 LOCK 住, 进 行 写 入 在 这 个 期 间 此 贴 图 无 法 进 行 渲 染 但 是 受 此 启 发, 我 们 可 以 把 CACHE 的 粒 度 放 为 每 层 CLIPMAP STACK 贴 图 结 合 多 线 程 与 DOULBE BUFFER 思 想, 方 法 如 下 : 1, 在 需 要 创 建 clipmap stack 贴 图 时, 对 每 层 贴 图 创 建 一 个 BACK BUFFER 2, 在 渲 染 CLIPMAP 同 时, 多 线 程 进 行 另 外 一 组 stack texture 的 更 新 虽 然 可 以 预 知 假 如 写 入 一 张 贴 图 要 阻 断 整 个 GPU 工 作 管 道 的 话, 但 是 由 于 多 线 程 把 一 组 stack texture 按 顺 序 更 新 所 以 避 免 了 在 主 循 环 并 发 一 次 性 更 新 整 个 stack texture array 如 果 显 卡 可 以 同 时 渲 染 和 写 入 back buffer 的 话, 则 效 率 应 该 会 提 高 3, 每 针 渲 染 完 毕, 调 换 STACK BACK BUFFER 到 前 台
这 个 方 法 DOULBE 了 CLIPMAP 占 用 内 存 但 是 在 多 核 环 境 下, 尤 其 显 卡 支 持 渲 染 时 并 发 写 入 贴 图 显 存 功 能 的 话,CLIPMAP 更 新 效 率 会 大 大 提 高 内 存 的 使 用, 前 面 进 行 过 计 算, 适 合 游 戏 的 贴 图, 采 用 1024 大 小 的 DDS CLIPMAP, 显 存 占 用 不 大 4-7,, 支 持 非 2 的 N 次 方 全 局 贴 图 在 游 戏 中, 一 个 全 局 的 世 界 如 果 只 能 是 2 的 N 次 方 大 小, 会 极 大 限 制 美 术 工 作 如 果 是 正 方 形 世 界, 贴 图 只 能 是 4G,16G,64G( 都 乘 1.33) 这 个 数 量 级 别 考 虑 引 入 MxN 大 小 的 贴 图 M 和 N 都 不 是 2 的 幂 我 们 在 之 上 取 任 意 一 点 P,k<Px<M-k, k<py<n-k, k=2^q(q=1,2,...),k 为 接 近 分 辨 率 的 一 个 2 的 幂 整 数 围 绕 P 建 立 一 个 边 长 为 k 的 正 方 形 以 k 正 方 形 为 基 础, 创 建 clipmap 这 个 clipmap 代 表 在 P 点 绘 制 需 要 的 贴 图 内 容 随 着 摄 像 机 移 动, 原 先 不 用 更 新 的 clipmap pyramid 也 需 要 根 据 ClipCenter 移 动 进 行 更 新 保 持 贴 图 棱 锥 还 是 以 2 的 幂 进 行 更 新 换 句 话 说, 除 了 clipmap stack 贴 图 更 新,clipmap pyramid 贴 图 以 及 其 mipmap 层, 都 需 要 更 新 这 样 一 来, 我 们 就 可 以 用 clipmap 进 行 任 意 长 宽 世 界 贴 图 的 渲 染 4-8, 支 持 法 线 贴 图 进 行 象 素 级 别 光 照 在 ID TECH5 演 示 中, 地 表 都 具 有 凹 凸 贴 图 象 素 光 照 在 这 里 无 法 给 出 确 切 的 实 现 方 法 只 是 尝 试 列 出 可 能 的 实 现 方 案 希 望 更 进 一 步 的 探 讨 法 线 贴 图 同 样 使 用 一 张 全 局 贴 图 1, multipass 方 法 使 用 第 二 张 clipmap 装 载 法 线 贴 图 2, 在 更 新 diffuse color clipmap 时, 利 用 3 张 clipmap stack 贴 图 的 ALPHA 通 道, 装 载 法 线 贴 图 的 z,y,z 或 者 只 装 载 x,y( 在 pixel shader 计 算 z) 然 后 在 pixel shader 重 组, 进 行 光 照 计 算 2 层 stack clipmap 代 表 一 层 normalmap 我 们 只 在 近 距 离 使 用 normalmap, 远 处 就 用 一 个 RGB(0.5,0.5,1) 的 蓝 色 象 素 代 替 在 超 出 clipmap stack 视 野 区 域 使 用 mipmap 的 trilinear 插 值 3, 使 用 clipmap 其 中 的 一 层 或 者 两 层 装 载 法 线 贴 图, 因 为 远 距 离 地 形 景 物 不 需 要 象 素 级 别 的 光 照 所 以 直 接 对 近 景 进 行 象 素 光 照 即 可 凹 凸 象 素 光 照 消 失 的 地 方 使 用 一 些 三 线 性 插 值, 平 滑 过 渡 4-9 非 地 形 应 用 Clipmap 主 要 用 于 大 规 模 地 形 渲 染 的 贴 图 调 度 在 此 基 础 上, 对 非 地 形 场 景 的 渲 染, 应 用 clipmap 也 称 为 可 能 Clipmap 实 际 是 对 贴 图 数 据 库 进 行 了 一 种 线 性 组 织 和 查 找 可 以 根 据 简 单 的 x,y 坐 标 以 及 u.v 贴 图 坐 标 定 位 所 需 要 贴 图 在 clipmap texture database 的 位 置 地 形 应 用 的 天 然 方 便 之 处 在 于, 地 形 网 格 的 空 间 位 置 本 身 就 说 明 了 其 贴 图 纹 理 在 clipmap texture database 中 的 位 置 根 据 此 思 想, 如 果 能 够 在 场 景 中 固 定 几 何 物 体 信 息 中 标 致 好 所 在 clipmap 数 据 库 中 的 位 置 并 且 有 效 组 织 场 景 中 的 几 何 体 贴 图 存 放 位 置 也 和 其 世 界 空 间 位 置 相 关 这 样 就 能 在 几 何 体 与 clipmap 之 间 建 立 起 一 种 联 系 随 着 摄 像 机 的 移 动,clipmap 贴 图 不 断 更 新, 相 应 场 景
中 的 物 体 就 被 赋 上 材 质 当 视 角 远 离 物 体, 此 物 体 贴 图 不 再 被 使 用, 从 显 存 中 清 除 这 样 就 实 现 了 非 地 形 的 海 量 几 何 物 体 贴 图 的 clipmap 管 理 此 思 想 只 是 停 留 在 思 考 阶 段 需 要 在 今 后 的 工 作 中 实 践 五, 是 否 值 得 5-1,, 地 形 渲 染 精 度 和 容 量 我 们 来 计 算 一 下 实 际 游 戏 大 概 需 要 的 贴 图 容 量 假 设 地 形, 高 度 图 的 一 个 象 素 代 表 一 个 格 子 一 个 格 子 代 表 现 实 一 米 屏 幕 分 辨 率 r=1024x1024 人 眼 离 地 面 最 低 距 离 d=1 米 FOV=90 离 地 面 最 近 距 离 为 人 眼 直 视 下 方 根 据 透 视 关 系, 可 以 推 算 出 在 屏 幕 上 2 米 的 格 子 将 会 撑 满 整 个 屏 幕 一 张 非 TILING 的 贴 图, 平 铺 在 地 下, 我 们 可 以 计 算 出, 如 果 需 要 屏 幕 的 一 个 象 素 恰 好 被 一 个 贴 图 图 素 覆 盖 (mipmaplod=0) 则 需 要 2x2 的 格 子 贴 一 张 1024 非 TILING 的 贴 图 对 于 一 个 格 子 贴 512 象 素 才 不 会 被 filter 进 行 插 值 模 糊 这 个 贴 图 细 节 度 是 非 常 惊 人 的 按 这 个 计 算, 要 一 张 全 局 RGB24BIT 贴 图 贴 满 1 平 方 公 里 的 区 域, 就 需 要 1024*1024*512*512*3*1.33 字 节 = 1Tb 的 RGB 贴 图 粗 略 估 计 JPEG 大 概 为 40-50G 之 间 但 是 1T 的 海 量 贴 图 相 当 于 一 张 1024x1024 图 的 26 万 倍, 这 基 本 不 太 可 能 由 美 术 手 工 完 成 而 且, 一 公 里 的 距 离 根 本 不 足 以 表 现 大 型 世 界 假 设 人 站 在 512,512 的 坐 标,500 米 的 直 线 距 离, 景 物 远 远 没 有 达 到 人 眼 视 界 之 外 人 眼 在 晴 天 看 远 处 山 脉 可 以 有 十 几 公 里 的 视 界 就 算 在 远 处 不 用 精 细 的 贴 图, 但 是 人 既 然 能 够 移 动 过 去, 那 么 必 然 要 制 作 这 么 大 范 围 的 全 局 贴 图 利 用 512 象 素 代 表 一 米 显 然 是 不 现 实 的 如 果 我 们 认 为 不 需 要 那 么 高 的 精 度 观 察 WOW, 粗 略 估 计 可 以 接 受 的 精 度 为,128-256 象 素 代 表 一 米 (WOW 基 本 为 256) 我 们 计 算 人 眼 离 地 1 米 时 一 个 图 素 覆 盖 4 个 象 素 插 值 的 情 况 :128*128*1024*1024*3*1.33 = 65G. JPEG 估 计 3G 4 平 方 公 里 就 是 48G 对 于 付 出 如 此 巨 大 代 价, 在 一 平 方 公 里 之 内, 让 美 术 进 行 了 相 当 于 一 万 六 千 多 张 1024x1024 地 图 的 手 绘, 实 时 渲 染 进 行 非 常 复 杂 的 CACHE 和 多 线 程 异 步 操 作, 得 到 的 效 果 只 是 4 个 象 素 模 糊 一 个 图 素 的 图 形 细 节 而 且 如 果 游 戏 想 承 载 4 平 方 公 里 的 地 域, 基 本 就 已 经 超 出 目 前 CONSOLE 和 PC 能 够 接 受 一 个 游 戏 容 量 的 范 围 即 便 是 蓝 光, 也 快 到 达 了 极 限 而 4 平 方 公 里 对 次 世 代 游 戏 来 说, 简 直 是 九 牛 一 毛 有 很 多 游 戏 (CRYSIS) 对 于 表 现 几 十 平 方 公 里 都 已 经 非 常 得 心 应 手 数 量 也 在 几 个 G 之 内 所 以 单 纯 使 用 clipmap 实 现 连 续 大 型 地 形 渲 染, 以 目 前 硬 件 容 量, 还 是 比 较 吃 力 需 要 其 他 优 化 手 段 配 合 接 下 来 计 算 贴 图 更 新 速 度 需 求 假 设 人 类 行 走 1.5 米 / 秒. 如 果 按 照 斜 前 方 行 走 1 米 128 图 素 Clipmap 为 1024 Clipmap stack 为 6 层 在 一 秒 人 类 行 走 经 过 的 地 域, 以 1024 为 边 界, 正 方 形 边 带 图 素 个 数 大 约 为 1.5/sqrt(2) *128* 1024 * 2 = 2172Kb 1 秒 钟 需 要 更 新 的 图 素 内 存 为 6x2172x3 = 39096Kb 大 约 40MB 假 设 30Hz 刷 新, 一 针 里 更 新 的 数 据 为 39096/30 = 1.3Mb 一 针 一 MB 的 数 据 流 量, 也 是 非 常 客 观 5-2,, 对 传 统 地 形 渲 染 方 法 进 行 STREAMING 5-1 节 对 使 用 全 局 贴 图 进 行 大 范 围 渲 染 的 数 量 和 最 小 贴 图 传 输 量 做 了 估 计 接 下 来 我 们
看 一 下, 应 用 clipmap 思 想, 传 统 地 形 渲 染 方 法 是 否 有 可 扩 展 的 空 间 在 1-2-1 和 1-2-2 使 用 tiling 的 两 种 地 形 渲 染 方 法 中, 都 提 到 要 应 用 至 少 1-2 张 全 局 地 表 纹 理 贴 图 在 使 用 全 局 贴 图 绘 制 过 程 中, 完 全 可 以 借 鉴 clipmap 的 技 术 把 全 局 alpha 和 lightmap, 或 者 全 局 diffuse 颜 色 图 放 入 clipmap 管 理 由 于 其 他 图 层 都 是 靠 tiling 实 现 理 论 上 可 以 实 现 贴 图 密 度 无 限 制, 贴 图 大 小 无 限 制 的 全 面 解 决 方 案 而 制 作 全 局 diffuse 颜 色 图 和 制 作 clipmap 全 局 图 一 样 Alpha map 靠 手 工 绘 制 Lightmap 可 以 自 动 生 成 并 不 会 比 只 使 用 一 张 全 局 地 形 贴 图 麻 烦 多 少 六, 结 论 Clipmap 极 大 的 释 放 了 显 存 限 制, 把 应 用 对 贴 图 细 节 的 无 限 增 长 需 求 转 化 为 对 clipmap 实 时 更 新 的 技 术 解 决 方 案 此 应 用 不 仅 可 以 用 于 大 规 模 地 形 渲 染, 也 可 以 应 用 与 大 型 场 景 中 固 定 几 何 物 体 的 贴 图 管 理 Clipmap 可 以 做 为 一 种 空 间 和 贴 图 数 据 库 的 对 应 管 理 系 统 并 且 在 象 素 级 别 进 行 LOD 结 合 geometry clipmap 的 应 用, 可 以 相 对 提 高 虚 拟 现 实 制 作 的 生 产 力 同 时 Clipmap 的 更 新 成 为 了 一 个 新 的 瓶 颈 在 PC 硬 件 架 构 上, 需 要 极 大 精 力 进 行 更 新 的 优 化 另 外, 在 对 次 世 代 游 戏 质 量 和 渲 染 精 度 的 标 准 下, 对 clipmap 采 用 全 局 世 界 纹 理 的 可 行 性 做 了 分 析, 并 提 出 了 质 疑 同 时 结 合 传 统 地 形 渲 染 方 法, 给 出 了 与 clipmap 相 结 合 的 可 能 性 来 信 请 给 puzzy4d@yahoo.com.cn, 欢 迎 讨 论 索 引 1 WORLD OF WOLFCRAFT,http://www.wowchina.com, Blizzard,2004 2 Far Cry, http://www.crytek.com/, Crytek,2007 3 <The Clipmap: A Virtual Mipmap>,Christopher C. Tanner, Christopher J. Migdal, and Michael T. Jones,Silicon Graphics Computer Systems,1998 4 EWINS Jp,WALLER MD,WHITE M,et a1.mip Map Level Selection for Texture Mapping[J].IEEE TRANSACTIONS ON VISUAIAZATION AND COMPUTE R GRAPHICS, 1998,4(4) 5 Mipmap 映 射 技 术 中 d 值 计 算 方 法 的 探 讨, 韩 慧 健, 徐 振 中, 张 诚 洁, 计 算 机 应 用, 第 24 卷 第 12 期,2004 6 Terrain Rendering Using GPU-Based Geometry Clipmaps,<GPU GEMS 2>, Hoope,NVIDIA,2005 7 NVIDIA, SDK10,clipmaps