Supreme Commander 堂吉参谋 画面 研究
Supreme Commander 堂吉参谋 画面 研究Supreme Commander我自己 定了个译名 翻译 为堂吉参谋 rts 游戏我感觉 也许 此文 还是 有点 用……2015年6月23 日原文地址你的英语水平 如果好的话强烈建议阅读原文原文 对于rts, 俯视图的图形渲染 使用 图形 表达的更加 清晰superme 光辉总督总督湮灭在我心中有一个特别的地方因为它是我玩的第一个RTS; 这是“ CommandConquer”和“ 星际争霸”是90年代末发布的最好的RTS之一。10年后 - 在2007年 - 其继任者被释放堂吉参谋…… 或 超级指挥……随着克里斯·泰勒作为设计师乔纳森·马弗 负责引擎 编程duixiang 此处可能有误……和杰里米·索尔的作曲一些背后的 原 “横扫千军”的 主要人物音乐吧……玩家 的 期望 很高。最高指挥官原来被评论家 和玩家 高度赞扬具有诸如“战略放大”或物理上现实的弹道之类的好功能。所以让我们来看看Moho引擎为 SupCom 提供动力呈现出一个游戏框架由于RenderDoc不支持 DirectX 9 游戏因此使用旧的PIX进行逆向工程。地形结构在我们挖掘框架渲染之前首先要谈谈 SupCom中 如何 构建 地形 以及 使用 哪种 技术。以下是“Finns Revenge”的 概述1对1 地图。左侧是整个地图的 顶视图就像在迷你地图上出现的游戏中一样。下面是从另一个角度看的相同的地图首先从高度图计算地形的几何。高度图 描述了地形的高程。白色表示高空黑色表示低空。对于我们的地图使用513x513单通道图像它代表了游戏中10x10公里的地形。SupCom 堂吉参谋 支持更大的地图 高达81x81公里。高度图镶嵌地形所以 我们 有一个 代表 我们 地形 的 网格。然后游戏应用 与 正常纹理 结合的反照率纹理 来覆盖 所有 这些 多边形。对于每个地图海平面也被指定所以游戏 调制海面下的 像素 的 反照率 颜色 给它们一个 蓝色的色调。线框 地形反照率 正常纹理海平面色调以前下一个123好的所以有 高度的纹理 是很好的 但它的限制 相当 快。我们如何在 地图 上添加 更多 细节 和 变体所使用的技术称为“ 纹理拼接 ”游戏画一系列 附加的 反照率正常 纹理。每个步骤都将 所谓的“层”添加 到 地形。我们已经有层次0具有 原始反照率颜色纹理 的 地形。要应用下一层我们需要一些额外的信息一个“splat map”告诉我们在哪里绘制 新的反照率正常更重要的是 不绘制的地方没有这样一个“地图”也称为 阿尔法地图应用一个新的层次将完全覆盖以前的层次。反照率和正常纹理在 应用于 网格 时 都 具有 自己的 缩放因子。基层0没有Splatmap反照率正常应用层1Splatmap反照率正常应用层2Splatmap反照率正常应用层3Splatmap反照率正常应用层4Splatmap反照率正常以前下一个1234五所以我们 应用层次1,2,3和4每个依赖于3个独立的纹理。反照率和正常纹理每个使用3个通道RGB但是 拼图 仅使用一个通道。因此作为 优化将4个 拼贴图 组合成 单个 RGBA 纹理。组合拼图好的所以我们的地形 有更多的 纹理变化。它从 远处 看起来 不错但 如果你放大你快速注意到 缺乏高频率的细节。这是在贴花时使用的这些 像是在本地修改反照率颜色和 像素法线的小精灵。这个地形有861个实例有21个独特的贴花。贴花以前贴花之后贴花亮点以前下一个123好多了一些植被 呢下一步是 添加 到 地形引擎 称之为“道具”树 或 摇滚模型。对于这张 地图有23个独特模型的6026个实例。道具之前道具之后道具突出显示以前下一个123现在最后一触海面。它是几个正常的 地图 和 沿着不同方向的 UV滚动 的 组合一个用于 靠近 岸边的 波浪的反射 和 精灵的 环境地图。海面以前海面之后以前下一个12我们的地形现在已经准备好了。为 地图设计师 创建好的 高度图和 拼图 可能是具有挑战性的但幸运的是有几个 工具 可以帮助 您 完成 任务官方的“Supcom Map Editor”或World Machine具有更高级的功能。所以现在我们知道SupCom地形背后的理论我们来看一下实际的游戏框架。框架细分这是我们将剖析的游戏框架果肉剔除翻译可能有误……游戏在RAM中是从高度图创建的地形网格由CPU镶嵌每个顶点的位置是已知的。当缩放级别变化时CPU会重新计算地形的镶嵌。我们的相机专注于靠近岸边的场景。渲染整个地形将是浪费计算因此引擎提取整个地形的子网仅提供播放器可见的部分并将该小部分提供给GPU进行渲染。果肉剔除之前果肉剔除之后 翻译 可能 有误……以前下一个12正常地图首先只计算法线。第一遍计算由5个层5个法线贴图和4个拼贴图的组合产生的法线。不同的法线贴图混合在一起所有的操作都是在切线空间中完成的。子网法线x5Splatmaps正常地图这是在一个具有6个纹理提取的单个绘图调用中完成的。你会注意到结果是相当“淡黄色”与其他普通的地图往往是 蓝色 相反。事实上这里的蓝色通道 根本就不用只有 红色和绿色。但是等一下一个正常的是一个3分量的矢量怎么只能存储2个组件它实际上是一种压缩技术在帖子结尾解释。现在让我们假设红色和绿色通道 包含我们所需要的关于法线的所有信息。地层已经完成了现在是贴花的轮到添加 地形贴花 和 建筑贴花 来调节地层法线。基础基地地形贴花基地地形贴花单位贴花以前下一个123我们还没有使用我们的渲染目标的蓝色和Alpha通道。所以游戏从512x512纹理中读取代表 地形的 全部法线从 原始高度图中 烘焙并使用 双三次插值 计算 每个像素 的 正常值。结果存储在蓝色和Alpha通道中。正常地图存储在蓝色和阿尔法的双三次插值。红色和绿色地层/贴花法线蓝色和阿尔法基础地形正常然后游戏将这两组法线 地层/贴花法线和 地形法线组合到 用于计算照明 的 最终 法线 中。最终法定地图这次没有压缩法线 使用 3个RGB 通道每个 组件一个。它可能看起来很绿但这是因为场景相当平坦结果是正确的您可以通过做任何像素并计算其法线矢量colorRGB * 2.0 - 1.0还可以检查矢量的范数为1。阴影贴图用于渲染阴影的技术是“Light Space Perspective Shadow Maps”或LiSPSM技术。在这里我们只是把太阳当成一个方向的光。渲染场景的每个 网格并将其与太阳的距离 存储 在1024×1024纹理的 红色通道 中。LiSPSM技术 计算 最佳投影空间 以最大化 阴影贴图 的 精度。以前下一个123如果我们停在这里我们只能画出阴影。当渲染单位时游戏实际上会尝试通过使用一些PCF采样来平滑阴影的边缘。但即使是PCF也没有办法获得我们在屏幕截图上看到的美丽的平滑阴影特别是地面上建筑物的平滑轮廓......那么这样做是如何实现的呢即使在 游戏开发 过程的 最后部分似乎 阴影的 实施 仍然 是一个持续的努力。这是Jonathan Mavor在游戏公开发布前11个月所说的话这些镜头的阴影 还没有完成我们还有一点点工作要做。[...]在这一点上我们还没有以任何方式 完成游戏。2006年2月24日Jonathan Mavor在宣布一个月后出现了一个新的 开创性 的 阴影贴图 技术差异阴影贴图或 VSM。它能够非常有效地呈现华丽的柔和阴影。似乎SupCom团队试图 尝试 这种 新技术反编译D3D 字节码揭示了对DepthToVariancePS()计算阴影贴图的模糊版本的函数的引用。在VSM发明之前阴影贴图不能也不会模糊。这里SupCom执行影子贴图的5x5 高斯模糊水平和垂直通过。LiSPSM高斯模糊模糊阴影贴图然而在D3D字节码中没有关于存储深度和平方深度VSM技术所需的信息的 指令。它似乎只是一个部分实现也许没有 时间来 完善 技术在 开发的 最后阶段但无论如何代码 原样可以产生 好的结果。注意伪VSM映射 仅用于在地面上 产生 软阴影。当阴影必须 被绘制到 一个单元上时它是通过使用 PCF采样的 LiSPSM 图 进行的。您可以在下面的 截图中 看到差异PCF在阴影边框上有块状工件不同的 阴影贴图 技术阴影地形由于生成的 正常地图 和 阴影贴图可以最终开始渲染地形带有 照明和阴影 的 纹理网格。SplatMaps水深图反照率纹理阴影正常灯光与阴影贴花绘制 贴花的 反照率分量 使用 正常信息 计算 照明方程。基础基地地形 贴花基地 地形贴花 单位贴花以前下一个123水反射我们在我们现场的右边有海所以如果机器人坐在水中我们应该能够看到它在海面上的反射。渲染表面的反射是一个经典的技巧执行一个附加的过程在应用相机变换之前垂直轴被缩放-1所以整个场景就水面而言是对称的就像一个镜像这正是 渲染反射 所需的 转换。SupCom堂吉参谋 使用 这种技术并将所有 镜像单元网格 渲染成 反射图。反射图网格渲染所有单位 然后 逐一 呈现。对于 植被几何实例化用于 在一个 绘图 调用 中 渲染 多个树。大海 使用 单个四面体 渲染像素着色器 提取 几个 法线贴图折射图直到 现在 呈现的 场景反射图 刚刚 生成的和一个 天空盒 进行 额外 的 反射。网格0网格30网格60网格100以前下一个1234在最后一幅图像中注意到屏幕边界附近的小黑色文物这是因为水面的取样 被 打乱造成 运动 错觉。有时中断会在 视口内 从 视口外部 导出 纹素但是这样的 信息 不存在因此黑色区域。此句翻译可能有误……在 游戏 过程 中UI实际上会隐藏在覆盖视口边缘的薄边框下的这些工件。网格结构SupCom中的每个 单元 都在 单个 绘图调用 中 呈现。模型 由一组 纹理 定义反照率地图一个正常的地图一个“镜面地图”实际上包含比镜面更多的信息。这是一个RGBA纹理红色反思 反映出多少环境地图。绿色高光。关于阳光。蓝色亮度 以后用于控制绽放。Alpha团队颜色 它根据 团队 颜色 调整 单位反照率。反照率地图正常地图粒子然后 渲染 所有 颗粒并且 还添加 每个 单元 的 健康条。基础场景基础场景粒子基础场景粒子健康酒吧此句翻译可能有误……以前下一个123盛开时间让事情闪耀但是由于我们使用LDR缓冲区我们如何获得“亮度信息” 亮度图实际上包含在Alpha通道中它同时被绘制在先前的网格上。创建帧的缩小版本使用alpha通道仅使亮区域突出并执行两个连续的高斯模糊。Alpha通道亮度模糊然后 将模糊的缓冲区用 添加剂混合画在 原始场景的 顶部。布卢姆以前布鲁姆之后以前下一个12用户界面我们完成了主要场景。UI终于被渲染它被精美优化单次绘制调用来渲染整个界面。1158个三角形立即被推送到GPU。UIUI线框高光以前下一个12像素着色器从单个1024x1024纹理读取其效果类似于纹理图集。当选择另一个单位时UI被修改纹理图集将被即时重新生成以包装一组新的精灵。我们完成了框架补充笔记详细程度由于SupCom支持缩放级别的巨大变化所以依赖于细节级别或LOD。如果玩家从地图上缩放可见单元的数量将迅速增加为了跟上GPU负载的增加需要渲染更简单的几何图形和更小的纹理。由于机组距离很远发动机可以随之消失机型更换为低多模型细节更少但在屏幕上显示的很小玩家几乎看不到与高分辨率楷模。LOD高LOD低LOD低线框LOD高线框以前下一个1234LOD不仅关注单位阴影贴花和道具停止超出一定距离。战争迷雾由于战争之雾每个单位都有一条视线只有靠近这个单位的地方才是完全可见的。不存在单位的区域是灰色以前访问过或黑色尚未开发。游戏将雾信息存储在128x128单声道纹理中其定义了雾的强度1表示无可见度而0表示完全可见。以前下一个123正常压缩如所承诺的这里是关于SupCom中用来压缩法线的技巧的简短解释。法线通常是三分量矢量但是在切线空间中矢量相对于表面切线表示X和Y在切线平面内而Z分量总是远离表面。默认情况下正常情况(0, 0, 1)是为什么当正常情况不受干扰时大多数正常地图显示为蓝色。所以假设正常是一个单位矢量它的长度是一个X² Y² Z² 1。如果你知道X和Y的值那么Z只能有两个可能的值Z ±√(1 - X² - Y²)。但是由于Z总是偏离表面所以必须是积极的所以我们有Z √(1 - X² - Y²)。这就是为什么只有在红色和绿色通道中存储X和Y就足够了Z可以从它们派生出来。在本文中可以找到更详细更好的解释。正常混合由于我们正在谈论法线SupCom 在法线贴图之间使用splatmaps作为因素来执行某种类型的语言。实际上有两种方法可以混合两个普通的地图不同的结果这不是一个简单的问题就像这篇文章解释一样。更多链接Jonathan Mavor 的博客有很多技术见解和关于TA Graphics Engine的非常好的帖子。TA发展背后的故事。非常有趣的阅读从1998年存档在Wayback机。有关SupCom地图编辑和修改的详细信息。关于这个主题的更多讨论Slashdot Hacker News Reddit。此外本文的打印副本已由Hacker Monthly提供。