Hack Age of Empires III更改着色器质量设置

2020年5月开始-如果您像我一样,那么隔离会使您重做了很多年没有发布的游戏。

如果您更像我,那么您可能会在某个地方摆放一张《帝国时代3》磁盘,也许您正在Mac上玩游戏,也许您还没有升级到Catalina,并且想命令Morgan Black。

因此,您开始游戏,进入主菜单,然后立即发现有问题...菜单看起来令人作呕


如果您想知道到底是什么“恶心”,请注意水。其他所有事情也很糟糕,但是不太明显。


因此,您进入选项,将所有参数提高到最大。但是游戏仍然很丑陋。

您会注意到“ Shader Quality选项被可疑地锁定为“ Low”

尝试1-hack参数


此时,您开始搜索该游戏的文件夹,该文件夹可能是在2005年创建的,所以应该在Documents文件夹中的某个位置创建该文件夹,然后每个人都去做。

我们在找什么?当然,存储参数的文件。菜单界面不允许我们更改设置,但是我们很棘手,对吗?

我们找到了所需的XML,因为游戏是2005年,当然是XML,我们遇到了选项“ optiongrfxshaderquality ”,该选项设置为0。似乎我们在寻找它,所以我们将值增加到100,因为质量不高。在这里,我同意你的看法。


您可能还会注意到,这是XML的可怕使用。幸运的是,他没有什么用处。

我们对自己感到满意,因此推出了这款游戏。 las,什么都没有改变。再次查看XML文件,我们看到该参数再次被设置为0。Ensemble Studios(希望它安然无))看上去很鄙视您。

之后,我们可以放弃。这是一台Mac,因此不太可能找到用户编写的补丁程序(实际上,我检查过-有各种各样可疑的解决方案都可以使用)。一切都与图形有关。似乎要解决该问题将很困难。

但是我们不会放弃。因为我们记得3岁时的模样,也记得我们如何欣赏这种美丽的波浪水。这些粒子效果。这些巨大的飞船只是不适合框架。而且,仅仅是相机被放大了,我在想什么?

尝试1-入侵数据


在“文档”文件夹的开头,有一个日志文件。游戏在那里写了一张图形卡,并报告它选择了“通用dx7”设置。它说您已经安装了Intel GMA 950,它确实在以前的计算机上。

但是,在此上您拥有的是Intel Iris Graphics6100。确实有些错误。您做一个假设-游戏确定计算机的图形功能,将其与图形卡数据库进行比较,而不是检查卡本身的功能。因为这正是AAA开发人员所做的,并且,如果您从事开源RTS的工作,那么您会知道这是如何发生的。


日志文件的内容。如果您将Intel指定为0x8086感到很有趣,则您选择了适当的文章。

偶然地,您会发现旧的补丁说明,这些内容可以确认您的担忧。您查看了GameData文件夹,但是只有.bar.xmb文件大部分是不可读的。您正在寻找 grep“ Intel ”和“ dx7 ”。什么都没发生。删除多个文件...什么都没有发生。但是您知道AAA游戏可以在奇怪的地方存储一些资源,而这是Mac上Windows游戏的移植端口,因此这里的一切都可能很奇怪。

最终,您找到文件“ render.bar”;如果移动它,则游戏在启动时会崩溃。不太清楚,但还不错。我们在Hex Fiend中打开文件,因为此程序通常使您可以了解二进制文件。事实证明。此数据的一部分是可读文本。其中一些是着色器。但是大多数数据被空白空间奇怪地分割了...


十六进制接口它是简约的,但是可以。第一个字节是字母“ ESPN”,很可能是.bar标头。

您惊呼:“显然,这是UTF-16!”该游戏是为Windows创建的,因此将文本存储在UTF-16中是合理的,几乎浪费了30 MB数据文件的一半。毕竟,Windows喜欢UTF-16(尽管它不应该),所以为什么不在一个文件中使用此编码和ASCII着色器。这是一个合理的想法!

(实际上,我花了大约一天的时间才弄清楚)

Hex Fiend可以选择解析像UTF-16这样的字节,因此我们还是在寻找grep字符串dx7。有几个条目。我们用dx9行替换它们,该行也在数据中找到,保存文件并启动游戏。

是啊再次记录不显示“ dx9”。这可能在其他地方设置。

让我们尝试其他事情。假设游戏可以识别图形卡,并且其十六进制标识符存储在日志中(在我的情况下,0x8086是Intel,还有0x2773)。我们正在寻找Hex Fiend中的“ 8086”,我们发现了一些内容,并且部分内容看起来很有希望。英特尔9系列是GMA 950系列,年龄3可能在它上不能很好地工作。


有些数字就像卡标识符(2582,2592);也许如果您更换它们,那么某些事情将会改变。无论如何,我们都制作了该文件的副本,因此您可以尝试。

las,这也是死胡同。实际上,我们正在研究错误的文件。幸运的是,我可以告诉您这一点,因为我花了很多时间并且尝试太多。该死的事情花了大约20个小时。这还不包括所有屏幕截图的时间...

所需的文件称为“ DataP.bar”,如果我们明智地替换ID,我们将在日志中看到全新的内容:


我不太明白为什么这个“通用dx7”与上面的屏幕截图不同。

当然,在游戏中,我们仍然受到“低”设置的限制,也就是说,日志不会说谎。我们希望有一个中等,但可惜

似乎更多来自黑客攻击的数据无法实现。现在该认真对待这些工具了。

尝试2-骇客


因此,如果没有成功,我们还有最后一件事:更改可执行文件本身(即,如他们在2005年所说,“破解”它)。如今,它似乎简单地称为黑客,但是这个术语在游戏盗版领域一直保留(当然,我个人从未这样做过)。

我们将转到文章中最有趣的部分(是的,您已经阅读了一千个单词,但这不是很好奇吗?)。

反汇编料斗


在这个阶段,我们的工具将是反汇编程序:一个接收可执行文件的二进制代码并将其转换为可读(哈哈)的汇编程序代码的应用程序。其中最受欢迎的是IDA Pro,但价格昂贵,而且我不确定它是否可以在Mac上运行,因此我将使用Hopper。它不是免费的(费用为90美元),但一次几乎可以使用所有必要功能,可以免费使用30分钟。

我不会详细解释该界面,因为Hopper教程中的所有内容都经过精心安排,但我将告诉您我将做些什么,并尝试拍摄足够的屏幕截图以便您可以学习一些东西。

首先,您需要说:我花了五天时间才解决,但尝试了许多失败的尝试。基本上,我将谈论成功的步骤,因此看起来很神奇。但这很困难。如果您有任何问题,请不要担心。

还有一点需要注意:“开裂”通常是非法的和/或出于非法目的而进行的。我展示了一个相当少见的合理使用示例,它同时完全是“白帽子”,因此这里的一切都井井有条。严格地说,我将假定这是非法的/违反最终用户协议,但显然是不可抗力的情况。尽其所能,为自己喜欢的东西付费,并且仅为此付费,因为反消费很酷。




拖动Age 3应用程序将其打开。只需选择“ x86”而不是powerPC,因为该游戏是2005版。

阶段1-搜索所需的片段


令人惊讶的是,这可能是最困难的。我们有一个反汇编的代码,但是我们不知道在哪里看。是的,有些游戏带有调试符号,因此您可以读取函数名称,但在我们的情况下则不能。Hopper为我们提供了诸如“ sub_a8cbb6”之类的名称,我们必须自己处理。

幸运的是,我们有一个领先的开始:我们的日志文件写入日志时很有可能使用字符串文字,即ASCII闪烁在可执行文件中。我们可以使用grep查找它们,因为我们不会通过任何编译将其删除(但是,可以通过代码混淆将它们隐藏起来。幸运的是,这没有发生。)查找grep字符串文字通常是反汇编程序时要做的第一件事。因此,让我们在料斗搜索框中输入“找到的供应商”,它将找到一些东西:


哦,是的,字符串文字,我很喜欢。

这本身并没有使我们前进太多。但是,由于此“文字串”的地址是硬编码的,因此我们可以找到指向它的链接。Hopper在右侧以绿色突出显示它们:“ DATA XREF = sub_1d5908 +1252。” 双击该行,我们将继续进行我们的hero- sub_1d5908过程


在这里,我们找到汇编代码。人们认为它很难阅读,但事实并非如此。最难的是要了解它。

默认情况下,Hopper使用“ Intel语法”,即第一个操作数是接收器,第二个操作数是源。在突出显示的行中,我们看到mov dword [esp+0x1DC8+var_1DC4], aXmlRenderConfi让我们弄清楚。

我们汇编程序的第一行


mov是一支以x86 Turing-complete闻名的MOV团队。它将数据从A移动(实际上是复制)到B,这实际上意味着读取A并将其写入B。基于上述,aXmlRenderConfi这是A,而dword [esp+0x1DC8+var_1DC4]这是B(接收者)。让我们仔细看看。

aXmlRenderConfi-这是Hopper帮助我们的价值。这实际上是我们几秒钟前单击的字符串文字的内存地址的别名。如果您拆分窗口并以十六进制模式查看代码(这是黑客首选模式),我们将在此处看到88 18 83 00


料斗方便地在两个窗口中突出显示相同的选定片段。

如果“ flip”值正确,那么我们将获得0x00831888-字符串文字的内存地址(在上面显示的屏幕快照之一中,它甚至用黄色突出显示)。因此,解决了一个难题:代码执行MOV,即它写入地址0x00831888。

为什么这样写88 18 83 00,而不是怎么00 83 18 88?发生这种情况的原因是字节顺序 -一个相当混乱的主题,通常影响不大。这是使人们说“计算机不工作”的事情之一。对我们来说,这意味着我们今天将要使用的所有这种问题都会发生。

您可能已经注意到,我说的是“写下地址”,这是对的:我们并不真正在乎内容,因为内容实际上是结尾为零字节的字符串文字。我们记下该地址,因为代码稍后将引用该地址。这是一个指针。

dword [esp+0x1DC8+var_1DC4]呢这里的一切都更加复杂。dword表示我们正在使用“双字(double-words)”,即16 * 2位。也就是说,我们复制32位。回想一下:我们的地址是0x00831888,即8个十六进制字符,每个十六进制字符可以具有16个值,即4个数据位。这样我们得到8 * 4 =32。顺便说一句,计算机系统的符号“ 32位”来自此处。如果使用64位,则内存地址将写为0x001122334455667788,长度将是原来的两倍,并且是2 ^ 32倍,并且必须复制16个字节。因此,我们将拥有更多的内存,但是复制指针将需要两倍的工作量,因此64位实际上不是32位的两倍。顺便说一下,这里可以找到术语“单词”的更详细说明。因为,这当然比我的解释要复杂。

那么,方括号中的部分呢?方括号表示我们计算其中的内容,并将其视为指针。因此,MOV命令将写入从计算中获得的存储器地址。让我们再次更详细地看一下(不用担心,当您完成此操作后,您实质上将知道如何使用Intel语法读取汇编代码)。

esp它是一个寄存器,它在汇编器中与变量最接近。 x86体系结构中有很多寄存器,不同的寄存器具有不同的应用方式,但是我们并不在乎。在此处了解更多信息。请注意,这里有用于浮点数的特殊寄存器,以及用于比较和类似操作的“标志”。其他所有内容都是十六进制数字,Hopper对其进行了一些修改以帮助我们。var_1DC4-this -0x1DC4,我们可以在过程开始时或在右侧面板中看到它。这意味着计算结果[esp+0x1DC8+var_1DC4][esp + 0x1DC8 — 0x1DC4]等于[esp + 4]。本质上,这意味着“取ESP寄存器的32位值,加4,并将结果解释为存储器地址”。

因此,我们重复:我们在“ esp + 4”中写入字符串文字的地址。这是正确的信息,但是完全没有用。这是什么意思?

这是阅读汇编代码的难点:解析它应该做什么。这是一个领先的开始:我们知道他极有可能在日志中写一些东西。因此,我们可以期望调用写入日志的函数。我们去找她


在上面的屏幕截图中,有几个类似的调用,以及call调用该过程的命令Hopper通常会谈论这个问题(我不知道他为什么不这样做),但实质上,我们提供了调用函数的参数。如果您单击不同的子例程调用,则会发现名为imp___jump_table___Z22StringVPrintfExWorkerAPcmmPS_PmmPKcS_的内容。这是函数解码名称,“ Printf”部分足以了解它确实输出了某些内容。我们不在乎她是如何做到的。

退后一步


在此阶段,我们完全偏离了所做的工作:我们试图说服游戏我们2015年的图形卡足以启动2005年的游戏。让我们总结一下。我们找到了记录日志的地方。如果幸运的话,这里是检查图形卡参数和功能的代码。幸运的是,我们真的很幸运(否则很可能不会出现本文)。

为了获得全面的了解,我们将使用“料斗控制流图”功能,该功能将代码分成小块,并绘制指示不同过渡的箭头。这比普通的汇编器要容易得多,后者通常都是一团糟。


日志条目的调用位于一个非常长的函数中间,因为这又一次通常发生在AAA游戏中。在这里,我们应该寻找其他Hopper字符串文字和“提示”,以期找到一些东西。该过程的开始是其余的日志记录,下面是有关“强制dx7”和“非常高”参数的有趣部分,以及像素着色器版本的问题……

我们“被入侵”数据的日志报告说,我们有版本为0.0的像素着色器,它们与“高”参数不兼容。该代码位于函数的左下角,如果仔细观察,您会发现一些奇怪的东西(谦卑的仆人突出显示):对于“ Very High”,“ High”,“ Medium”和“ Low”参数,此代码重复了四次。是的,我花了几个小时才找到它。


我以蓝色突出显示了在日志中显示“像素着色器版本0.0高”的块。我用其他美丽的颜色突出了相似的部分。

唯一的区别是我们在不同的地方写了“ 0x0”,“ 0x1”,“ 0x2”和“ 0x3”。这可疑地类似于我们上面检查的参数文件和optiongrfxshaderquality参数(您可能还不了解这一点。但是,相信我)。

在这个阶段,我们可以尝试采用不同的方式,就像我所做的那样。但我会简短地说-我们将做最必要的事情:找出像素着色器验证失败的原因。让我们寻找一个分支。日志的输出块是线性的,这意味着它应该在上面。


SEMVER爱好者,请参阅更高级的版本格式:浮点数。

实际上,在其上方有jb一个转换命令(以“ goto”为例)。这是一个“ 条件跳转 ”,条件是“ 如果小于”。汇编程序“ ifs”通过寄存器标志工作,我在上面简要地谈到过。仅知道我们需要查看上面的命令就足够了:很可能,它会设置标志。通常这是命令cmptest,但在这里使用ucomiss。这是野蛮行为。但是她很容易用谷歌搜索ucomiss。这是一个浮点比较命令,这说明了为什么代码具有xmm0:这是浮点数的寄存器。这是合乎逻辑的:日志报告我们的像素着色器版本为“ 0.0”,这是一个浮点值。那么,什么位于内存地址0x89034c呢?十六进制数据看起来00 00 00 40很容易混淆。但是我们知道我们应该期望浮点数,所以让我们这样解释数据:意味着2.0。这是Microsoft在其高级着色语言中实际使用的像素着色器版本的逻辑浮点值在其上编写DirectX着色器。即使Mac上的端口使用OpenGL,Age 3还是DirectX游戏。在2005年,需要使用2.0版的像素着色器来启用High参数,这是合乎逻辑的,因此我们朝着正确的方向发展。

我们该如何解决?该比较指令将与xmm0上一行中给出的值进行比较movss xmm0, dword [eax+0xA2A8]MOVSS是用于浮点寄存器的特殊“移动”命令,我们从地址写入32位,这是评估eax + 0xA2A8的结果。

大概该值不是2.0,而是0.0。让我们修复它。

做真正的黑客


最后,我们准备了解高级游戏的参数。我们想走“红色”的道路,跳过“错误版本的像素着色器”的所有逻辑。这可以通过成功通过比较来完成,也就是通过反转转换条件来完成,但是还有另外一个技巧:代码的组成方式是,当删除转换时,我们将采用“红色”方式。让我们仅用nop不执行任何操作的操作来替换过渡(不可能简单地将数据删除或添加到可执行文件中,因为会发生偏移,并且一切都会中断)。

我建议您退出CFG,因为否则Hopper会发疯。如果一切操作正确,则在十六进制窗口中,我们将看到红线。



红色显示我们所做的更改。此时,如果您为Hopper付款,则只需保存文件即可。但是我没有付款,所以我将在Hex Fiend中打开可执行文件,找到所需的区域(将区域从Hopper复制到Hex Fiend的“查找”选项卡中)并手动进行更改。在这里要小心,您可能会破坏所有内容,因此建议您将源可执行文件复制到某个位置。

完成此操作后,开始游戏,转到选项。。。加油-我们可以选择“高”。但是我们不能选择“中等”。而且我们不能使用高阴影设置。尽管如此,我们正在进步!


只需看看水中的这些宏伟的倒影即可!

增强功能


实际上,您可以以最佳方式解决此问题。我们的解决方案有效,但是我们可以做到,以便正确满足条件:让游戏认为我们的显卡实际上具有2.0版着色器。

我们记得,游戏将值加载到address eax+0xA2A8。您可以使用Hopper来查找最初在此处记录的内容。我们需要找到一个将0xA2A8用作接收方操作数的命令(我选择了0xA2A8,因为它是一个相当具体的值,我们不能确定在其他地方不使用相同的寄存器)。在这里,料斗背光对我们非常有用,因为我们只需单击0xA2A8并查找CFG中的黄色部分即可。


我们的胜利要高一些:正如我们预期的那样,我们编写某种浮点寄存器的值。我承认我并不真正了解在此之前发生了什么(我的最佳猜测:游戏会检查纹理压缩的可能性),但这并不是特别重要。让我们写“ 2.0”并继续工作。

为此,我们将使用Hopper应用程序的“汇编指令”,然后在Hex Fiend中进行相同的操作。




我们使用MOV代替MOVSS,因为我们写的是常规值,而不是浮点寄存器的特殊值。另外,它是直接字节顺序的,即反转的。

您会注意到正在发生奇怪的事情:我们“吃”了团队jb。发生这种情况是因为新命令比上一个命令占用了更多的字节,而且正如我所说,我们无法从可执行文件中添加或删除数据来保存偏移量。因此,霍珀别无选择,只能消灭团队jb。这可能会成为一个问题,我们可以通过向上移动命令来消除它(毕竟,我们不再需要编写xmm3值)。这将在这里起作用,因为在任何情况下,我们都在正确的路径上进行分支。幸运。

如果您开始游戏……那么什么都不会改变。我建议英特尔9系列的速度不够快,因此游戏会抱怨。这不是问题,因为实际上我们正在争取“非常高”。

在2004年左右,最强大的显卡是什么?NVIDIA GeforceFX6800。让我们诱骗我们说服我们安装了游戏。

下兔子洞


是的,这是一个全新的部分。

我们知道游戏使用十六进制代码来引用图形卡,并且它从数据文件中接收信息。我们知道这应该发生在我们正在研究的函数中(至少,如果不是这样,那将很奇怪)。因此,我们可以找到执行此操作的代码。但这仍然很困难,因为我们不知道要寻找什么。

我们有一个线索:选项表现异常;存在低/高,但是没有中。因此,也许还有另一个代码可以处理所有这些“非常高”,“高”,“中”和“低”的代码。实际上,他的职责是相同的。他在CFG的工作要早得多,而且似乎很有趣。


我们可以假定原始数据存储在某种XML中,因为很有可能,因为还有其他几个XML数据文件。 XML本质上是一堆指针和属性。因此,此处的代码很可能会检查某些XML属性(实际上,以下是“预期ID之一,非常高...”,与检查文件的正确性非常相似)。我们可以想象一个类似的XML结构,其中布尔值确定着色器的质量:


值得考虑的是,这是一个非常武断的猜测。一切看起来可能有所不同。

CFG的左侧显示了一个非常有趣的部分(您可以在右侧,但在屏幕快照的左侧显示):我们看到了var_CC将设备ID写入日志的代码中使用的相同部分也就是说ebp+var_CC,可能是指我们设备的ID 0x2773。奇怪的是,第一个“ check”中没有字符串文字,但这是一个Hopper错误:地址0x0089da8e包含十六进制数据69006400,在UTF-16中它代表“ id”(实际上,Hopper可能无法理解这一点,因为UTF16)。我们只是在寻找一个ID。

你知道吗?让我们运行调试器并检查现实中的所有内容。

游戏调试


打开一个终端窗口并运行lldb(只需键入lldb并按Enter)。首先,我们需要告知LLDB遵循年龄3,然后可以通过致电开始游戏run。游戏开始,我们没有任何用处。


现在,我们需要添加一个断点:为了确认我们的假设,当我们到达上面显示的代码时,我们想停止执行。我们没有源代码,但是没关系:我们可以在内存地址处设置一个断点。我们在代码中有地址。让我们在接收到“ id”的MOV调用中添加一个停靠点,其地址为0x001d5e68。要添加断点,只需输入br set -a 001D5E68。开始游戏后,它停止并且LLDB显示反汇编的代码(使用AT&T语法,而不是Intel,因此所有操作数都被取反,但是我们看到的是相同的代码)。您可能会注意到,在这种情况下,LLDB实际上比Hopper更聪明。他告诉我们,我们正在执行与XML和printf输出有关的操作。



感觉像个黑客?

要继续前进,让我们采取“步骤说明”。一个简短的命令
ni重复几次,我们注意到我们回到了起点。这是一个循环!这是完全合乎逻辑的:我们可能正在迭代某种XML。实际上,霍珀向我们展示了这一点-如果我们遵循CFG,我们将看到一个(可能的)周期。


这意味着:if (*(ebp+var_CC) == *(ebp+var_28)) { *(ebp+var_1D84)=edi }

其退出条件是该值ebp+var_1D84不为零。在我突出显示的代码中,我们看到了一个有趣的代码参数var_CC

让我们在这一点上添加一个断点,cmp然后我们会弄清楚。



左:在CMP上设置一个断点并继续执行。在右边,我们监视寄存器和存储器。

我们用看寄存器,用看reg r存储器值mem read $ebp-0x28eax并且实际上包含0x2773,并且内存中的值现在为0x00A0。如果您多次执行thread c它,那么我们将发现在搜索匹配项时,迭代发生在不同的ID上。在某个阶段,值将重合,循环将退出,游戏将开始。现在我们知道如何管理它了。

回顾日志文件:它标识了设备和制造商。大概在某个地方,制造商的名字也有类似的循环。实际上,它非常相似,位于我们循环上方的CFG中。这个循环有点简单,我们在寻找字符串“ vendor”。

这次比较完成了var_D0该变量实际上用作制造商ID。如果我们在此处放置一个断点并检查所有内容,我们将在处看到熟悉的0x8086 eax,与此同时,正在与0x10DE进行比较。让我们写它eax,看看会发生什么。



哇。

也就是说,0x10DE是NVIDIA。实际上,在研究数据文件时可以理解这一点,但这并不是很有趣。现在的问题是:GeforceFX 6800的标识符是什么?我们可以使用LLDB并仅检查每个标识符,但这需要时间(有很多标识符,我试图找到合适的标识符)。因此,这次让我们看一下render.bar。


假设这是“ XMB”,这是Age 3中使用的XML的二进制表示形式。

此文件非常混乱。但是在Geforce FX 6800标签之后,我们看到了几个标识符。我们很可能需要其中之一。让我们尝试00F1。

测试此问题的最简单方法是使用LLDB并设置所需的断点。我将跳过此步骤,但我要说00F1出现了(很幸运)。

在这一阶段,我们需要回答以下问题:“如何使这种改变永久化?”看来,这将是更容易改变的价值观var_CCvar_D0对0X00F1和0X10DE。为此,我们只需要获取代码空间即可。

一种简单的解决方案是将日志记录调用之一替换为NOP,例如子系统调用。这将释放我们几十个字节,这甚至超过了必要。让我们选择所有这些并将其替换为NOP。然后,我们只需要使用MOV变量来编写信息:assembler mov dword [ebp+var_CC], 0xF1mov dword [ebp+var_D0], 0x10DE





让我们运行游戏之前和之后最后,我们取得了一些成就:您可以从“低”,“中”或“高”中进行选择,以及为阴影启用“高”参数。


但是我们仍然无法启用“非常高”,这很可悲。发生了什么?


知道了

事实证明,Geforce FX 6800应该支持3.0版像素着色器,而我们仅设置了2.0版。现在,我们可以轻松地对其进行修复:只需在中编写3.0浮点数即可ebp+0xA2A8。此值为0x40400000。

最后,游戏不再反复无常,我们可以享受极高的设置。


奇怪,但看起来却完全不同。颜色不那么鲜艳,并且出现了与范围相关的雾。还有一个阴影冲突的小问题(也在上面的屏幕截图中,这是由于阴影参数高,而不是着色器的质量),我还无法解决。

这就是我们旅程的终点​​,感谢您的阅读。

另外,我将举例说明游戏中每个参数的外观,因为在网上找到的所有屏幕截图都很糟糕或不完整。

Medium上的图形是完全可以接受的,但是缺少阴影。据我所知,“非常高”在很大程度上增加了一个完全不同的LUT(有关此术语的很好解释,请参见本文的“颜色分级”部分),远处的雾气,甚至是完全不同的照明模式?画面很不一样,很奇怪。





从上到下:超高,高(具有高阴影选项),中(仅启用阴影),低(禁用阴影)。

其他有用的链接


我上面链接到的博客包含对现代渲染管道的精彩分析:http : //www.adriancourreges.com/blog/

费率0 AD是同类型的开源RTS游戏:https : //play0ad.com。她需要开发人员。

如果您想进一步了解XMB格式,可以在0 AD中阅读其代码。我没有检查,但是我很确定这是相同的格式,因为在2004年的《帝国时代》中为年龄3编写XMB解码器的人还在0 AD源代码中实现了这些文件。因此,这将是一门有趣的代码古生物学课程。谢谢您的所有工作,Ykkrosh。

我确实记得我阅读了关于使用Hopper的出色教程,但是现在找不到链接。如果有人知道我在说什么,请删除链接。

最后,我要提到Cosmic Frontier项目:对经典Escape Velocity系列的重制(更多的Override,但它也与Nova兼容)。这是一个了不起的游戏,可惜很少有人知道。现在,创作者已经在Kickstarter上发起了一项活动,首席开发者有一个非常有趣的开发博客,该博客讨论了如何使用Hex Fiend反向工程原始游戏的数据格式。这是一本好书。如果您认为我的文章太疯狂了。然后在其中一篇文章中:

  • 我们启动了经典的Mac仿真器,以使用过时的API来读取加密的数据文件。
  • 从游戏代码进行反向工程加密
  • 他们使用文件系统黑客程序在现代Mac上访问相同的数据。

是的,他们是真正的热情人士,我希望他们的项目能够成功完成,因为EV Nova是我最喜欢的游戏。

All Articles