原文地址 http://renderingpipeline.com/2012/03/megatextures-in-rage/
2012年3月4日 罗伯特
id Software的第一人称射击游戏Rage实现了一种称为Megatextures
或Virtual Textures的技术,它基本上模仿了一个MMU来处理大于显卡内存的纹理。
实施规模从游戏机到高端PC,并允许在所有平台上使用相同的资产 -
这对艺术家来说是一个巨大的加分。
他们也不必考虑纹理内存预算,并且他们可以在没有玩家注意到的地方重复纹理。
整个游戏世界可以以独特的方式进行纹理化,
引擎在运行时可以确定需要哪些部件并将其加载到GPU内存中。
由Wolfgang Engel编辑的“GPU Pro:高级渲染技术”(着名的ShaderX书籍)的书籍
包含了两篇关于虚拟纹理的文章:
MG Chajdas等人的“虚拟纹理映射101”
和C Hollemeersch等人“使用CUDA加速虚拟纹理化”
从ID 的JMP van Waveren谈话中的幻灯片给出了
对Rage中使用的实现的一个很好的介绍。
这些幻灯片还显示了显示游戏引擎中纹理图块的调试模式的屏幕截图。
幸运的是,这些调试选项在最终的游戏中没有被删除,只是隐藏:-)
使用游戏控制台,可以使用以下命令来获得引擎技术方面更好的印象:
vt_restart | 丢弃旧缓存并开始重建纹理缓存。您可以在几秒钟内看到纹理mipmap级别从粗略切换到精细级别。 |
vt_singleStep 0 | 取消激活新的图块交换 - 如果您现在移动,您可以查看为以前未渲染的图层部分加载哪些mipmap级别。 |
vt_singleStep -1 | 重新启动虚拟纹理。 |
toggle vt_showPageNumbers; vt_restart | 在每个图块中添加图块边框和图块编号。 |
toggle vt_showPageMips; vt_restart | 可视化mipmap级别:红色是高分辨率图块,绿色粗略水平。 |
toggle vt_showFeedbackStreaming | 显示渲染图像的哪些部分需要更高分辨率的图块。 |
toggle vt_showFeedbackBuffer | 可视化用于计算缺失图块的反馈缓冲区。 |
我们可以在这里看到,在小型室内区域,最好的mipmap分辨率(红色)可以被加载,
人们具有比环境更高的细节纹理:
我们来看看一个更大的门外的场景:天空盒不是虚拟纹理的一部分,
而是一个额外的静态纹理(灌注的广告牌和
爆炸的动画等也是如此)。这个动画显示了瓷砖加载的三个步骤:
该场景的反馈缓冲区显示所需mipmap级别中的图像块的哪些部分存在(绿色),
并且存在与所需级别和缓存级别最大的差异(紫色):
请注意,缓冲区的大小为160×120像素,因此不具有屏幕的宽高比。
最后,反馈蒸汽:(?此处翻译待定)
还有一点很有趣的是,即使玩家从未看过相应的几何,场景中的哪些部分仍然保留在缓存中的时间以及哪
些部分被交换。为此,重新启动虚拟纹理以刷新旧缓存并等待纹理被交换。
在该时间段内不要移动以仅请求场景当前可见部分的图块。
然后关闭虚拟纹理,环顾四周。
这是我首先重新加载所有虚拟纹理的起始位置,并将纹理的更新关闭:
请注意,右侧的建筑物一半可见。
向右看,模糊的纹理变得可见,但即使我们从来没有朝这个方向前进,
预先加载了地图的一部分:
反馈缓冲区可能显示哪些部件是预加载的。
如果您有访问这个游戏(PC版本变得便宜得很快),我只能推荐玩这些命令。
此外,非常感谢您在最终游戏中将这些命令留给了ID Software。
更新:
以下是执行调试命令的一些记录:
请注意,在第二十二我重新启动缓存填充。
在开始的旋转过程中,您可以看到如何将新的图块装载到缓存中(左侧)。
这是用'toggle vt_showPageColors; vt_restart“,它为每个图块提供了随机颜色,
因此每个图块更新都清晰可见。