本文由第三方AI基于17173文章http://news.17173.com/content/12022025/102603799.shtml提炼总结而成,可能与原文真实意图存在偏差。不代表网站观点和立场。推荐点击链接阅读原文细致比对和校验。
《默特术士》周一随想第35期:超级着色器的崛起
2025-12-02 10:26:03
神评论
17173 新闻导语
揭秘《默特术士》超级着色器:如何用单一技术实现全动画,性能飙升4倍!技术美术深度解析,优化游戏沉浸感与性能的终极方案。
今天该回归超级极客和技术宅模式了!很多问题只有深入开发阶段才会暴露,《默特术士》的美术管线绝对是其中之一。我在技术美术和特效美术领域有多年的经验,还有我们在先前随想中探讨过的疯狂科学家式解决方案。所有这些最终汇聚成了《默特术士》的超级着色器。
当然可以为游戏中每个独特结构定制材质、定制技术、定制分层方案,但当我们仅植物就有上百种,更不用说数十种建筑的多角度旋转时,就需要找到既能保证性能效率,又能优化迭代创作时间的方法,避免被像素海洋淹没。于是我们的目标变成了:一石能击几鸟。

批处理本质上是告诉显卡:保持当前操作,尽可能一次性处理更多内容。由于《默特术士》采用自上而下层层渲染的方式,大多数结构只是加载纹理、绘制精灵、重复循环。问题在于即使屏幕上只有一堆树,每棵树也会成为独立绘制调用,因为每个都引用自己的小纹理集。通常可以用精灵图集解决,但图集很少使用多重技术纹理。不过这阻止不了我们:)

将过去两年的大部分美术工作压缩到单张图像简直疯狂。这仅是超级着色器使用的6张图像中的两张。这种材质处理方式让我们能在单次渲染中实现色调偏移、夜间辉光、风力摇摆、自定义滚动等众多效果。测试期间,我将测试场景的绘制调用从960次降至230次,这对性能提升是巨大的。关键还在于每个精灵都能受益于我们长期构建的所有疯狂纹理操作。想要风力摇摆、夜间照明加上自定义UV?我们全都能实现。


这个功能特别酷,因为我们可以用简单浮点值让UV读取特定区域,比如读取0-0.25(底部四分之一)然后切换+0.25读取上一个纹理,依此类推。通常需要通过材质控制,但这里的魔法在于我们可以通过遮罩通道驱动。例如我可以设定#111111表示偏移0.25,#222222表示偏移0.5等。
这还带来两个绝妙的附加好处:该技术可用于将着色器分支到未来其他路径,而无需在着色器内引入真假布尔值(通常不好)。全是加法和乘法运算,让显卡非常开心。而且我们可以在同一物体内混合搭配,因为全都通过像素遮罩颜色控制。

好吧最后这段可能让部分人跟不上,只需知道摇曳的树木、旋转的齿轮、流动的河水和生物发光晶洞全都通过单一(复杂)技术绘制,这意味着更好的性能、更高的艺术一致性以及所有结构同步实现更快的艺术迭代。说实话这是我最痴迷的部分,就像自己的炼金工坊,可以把所有东西炸开重新组装成新奇而迷人的混沌合剂。这太美了。
回实验室了 :) 🌿
~CyanAvatar
但这是为什么呢?
有太多细微因素影响着沉浸感——树木摇曳、云朵飘动、阴影渐变。虽然并非全部必需,但它们的缺席比存在更引人注意,哪怕只是潜意识层面的。我们在第12期和第24期探讨过实现沉浸感和2D动态的各种黑魔法,这就引出了今天的问题:如果我们想给游戏中所有元素添加动画,最佳实现方式是什么?当然可以为游戏中每个独特结构定制材质、定制技术、定制分层方案,但当我们仅植物就有上百种,更不用说数十种建筑的多角度旋转时,就需要找到既能保证性能效率,又能优化迭代创作时间的方法,避免被像素海洋淹没。于是我们的目标变成了:一石能击几鸟。

这是我筑起的高山
为实现所有目标——轻松迭代、良好帧率、艺术自由——我们采用了如今较少使用的一项技术:单一着色器实现全功能。这听起来很可怕,因为着色器本身超级复杂,可能会调用许多用不上的功能,但它能实现一个关键功能——批处理。批处理本质上是告诉显卡:保持当前操作,尽可能一次性处理更多内容。由于《默特术士》采用自上而下层层渲染的方式,大多数结构只是加载纹理、绘制精灵、重复循环。问题在于即使屏幕上只有一堆树,每棵树也会成为独立绘制调用,因为每个都引用自己的小纹理集。通常可以用精灵图集解决,但图集很少使用多重技术纹理。不过这阻止不了我们:)

将过去两年的大部分美术工作压缩到单张图像简直疯狂。这仅是超级着色器使用的6张图像中的两张。这种材质处理方式让我们能在单次渲染中实现色调偏移、夜间辉光、风力摇摆、自定义滚动等众多效果。测试期间,我将测试场景的绘制调用从960次降至230次,这对性能提升是巨大的。关键还在于每个精灵都能受益于我们长期构建的所有疯狂纹理操作。想要风力摇摆、夜间照明加上自定义UV?我们全都能实现。

实用的疯狂科学
如果详细说明这个着色器能实现的所有附加功能,我可以说上一整天,但特别想分享这个实现的疯狂技术——所有拖尾纹理都能在同一个着色器上工作。
这个功能特别酷,因为我们可以用简单浮点值让UV读取特定区域,比如读取0-0.25(底部四分之一)然后切换+0.25读取上一个纹理,依此类推。通常需要通过材质控制,但这里的魔法在于我们可以通过遮罩通道驱动。例如我可以设定#111111表示偏移0.25,#222222表示偏移0.5等。
这还带来两个绝妙的附加好处:该技术可用于将着色器分支到未来其他路径,而无需在着色器内引入真假布尔值(通常不好)。全是加法和乘法运算,让显卡非常开心。而且我们可以在同一物体内混合搭配,因为全都通过像素遮罩颜色控制。

好吧最后这段可能让部分人跟不上,只需知道摇曳的树木、旋转的齿轮、流动的河水和生物发光晶洞全都通过单一(复杂)技术绘制,这意味着更好的性能、更高的艺术一致性以及所有结构同步实现更快的艺术迭代。说实话这是我最痴迷的部分,就像自己的炼金工坊,可以把所有东西炸开重新组装成新奇而迷人的混沌合剂。这太美了。
回实验室了 :) 🌿
~CyanAvatar
【来源:steam】


