返回行业情报

Godot PS1风格渲染插件技术解析

Try This Authentic PS1-Style Rendering Add-On For Godot

独立开发者Calin P基于其PS1模拟器开发经验,撰文解析PS1固定功能管线渲染原理,并发布MIT许可的Godot插件,实现顶点抖动、仿射纹理映射、抖动、雾效等PS1标志性视觉效果,支持单次绘制调用渲染全部3D几何体。

深度解读

PS1风格渲染在Godot里的"正确打开方式",不是加个像素滤镜那么简单,而是要从硬件层面复现那套固定功能管线的每一个"缺陷"。

一个独立开发者,用写模拟器的经验反哺游戏引擎

Calin P 这个名字对关注复古独立游戏的人来说不算陌生——他是那个真的让游戏跑在初代 PlayStation 实机上的开发者,还做过《梦日记》(Yume Nikki)的 PS1 平台 3D 同人重制。这次他把自己写 PS1 模拟器 P-chan 时积累的硬件知识,转化成了一套 Godot 的渲染方案,MIT 协议开源在 GitHub 上。

这件事的意义在于:大多数"PS1风格"教程教你的是模仿结果——加个低分辨率、贴个抖动纹理、让顶点抖一抖就完事。而 Calin P 走的是还原成因的路线。这两者的差距,在项目规模变大之后会暴露得非常明显。

固定功能管线:PS1 GPU 只会用一种方式画多边形

原文里最关键的一句话是:

The PlayStation GPU works via something that's known as a fixed-function pipeline. This means it always draws polygons (not just triangles, that's not a mistake) the exact same way outside some parameters you can set in the draw call.

这里有两个容易被忽略的点。第一,PS1 的 GPU 画的是多边形(polygons)而非现代 GPU 惯用的三角形——这不是笔误。第二,因为管线是固定的,所有物体的渲染方式在硬件层面就是统一的,你能调的只有 draw call 里那几个参数。

这个硬件特性直接推导出一个对开发者极其友好的结论:你可以用同一个材质渲染游戏里所有物体,并用实例化渲染把所有 3D 几何体塞进一个 draw call。现代 GPU 是可编程的,理论上你能写出任何"怪物级"着色器,但代价是每个物体可能都需要不同的材质和状态切换。PS1 的"限制"反而成了性能优势的来源。

不过原文也标注了一个重要前提:Godot 只在 Forward+ 渲染器下支持实例化渲染(batching),而且使用不同纹理会打断 batching。这意味着如果你想吃满这个性能红利,纹理图集(texture atlas)几乎是必须的工程决策,而不是可选优化。

那些"缺陷"才是风格本身

Calin P 的 shader 功能列表值得逐项拆开看,因为每一项对应的都是 PS1 硬件的一个真实限制:

顶点 snapping(顶点吸附)——PS1 没有浮点顶点坐标,顶点位置被量化到整数网格上,导致模型在移动时顶点会"跳"。这是 PS1 画面最具辨识度的特征之一,也是很多粗制滥造的复古 shader 最容易做过头或做不足的地方。

Flat-triangle depth buffer(平面三角形深度缓冲)——PS1 的深度缓冲不是按像素插值的,而是按三角形平面计算的。这导致了那个经典的深度冲突(z-fighting)和排序错误,比如《最终幻想7》里某些场景中角色手臂穿过身体、贴图闪烁的现象。

Affine texture mapping(仿射纹理映射)——PS1 不做透视校正,导致纹理在斜面上会出现明显的"游泳"和扭曲。这是那个时代最标志性的视觉瑕疵,也是《古墓丽影》地板纹理"晃动"的根源。

Per-model dithering(逐模型抖动)——PS1 输出 15-bit 色深,抖动是硬件层面的。Calin P 做到了"准确且细粒度"的逐模型控制,这意味着不同物体可以有不同的抖动表现,而不是全屏统一加一层噪声。

Silent Hill 式雾效——这个单独列出来很有意思。PS1 的雾本来是为了掩盖绘制距离不足的技术手段,《寂静岭》把它变成了艺术方向。Calin P 专门推荐了 Elias Daler 关于雾的视频,说明他把雾当作一个需要认真对待的渲染特性,而不是随便加个距离衰减。

所以这对行业意味着什么

对独立开发者:这套方案把"PS1风格"从美术选择变成了工程选择。你不再需要手动为每个物体调材质参数来"假装"复古,而是可以用一套统一的管线处理所有几何体,同时获得性能收益。对于小团队来说,这是实打实的生产力工具。

对"复古美学"的讨论:原文开头提到了一种观点——有人觉得 PS1 风格是"偷懒让游戏看起来有趣"。Calin P 的工作恰恰反驳了这一点:要把 PS1 风格做,你需要理解固定功能管线、深度缓冲的数学、仿射映射的几何原理、15-bit 色深的抖动算法。这比调一个 PBR 材质难得多。真正偷懒的是那些只加了个像素化后处理就自称"PS1风格"的项目。

对 Godot 生态:这是 Godot 作为"复古友好引擎"定位的又一次强化。Unity 和 Unreal 当然也能做 PS1 风格,但 Godot 的 Forward+ 渲染器对实例化的支持、以及社区对这类低多边形工作流的积累,正在形成一个正向循环。MIT 协议意味着这套 shader 可以被任何商业项目直接采用,没有法律障碍。

对模拟器开发与游戏开发的交叉:Calin P 的路径——先写模拟器理解硬件,再把理解转化为引擎内的渲染方案——是一条值得更多开发者关注的路线。模拟器开发迫使你面对硬件的真实行为,而不是 API 文档里的理想化描述。这种知识在游戏开发中同样值钱,尤其是在追求特定硬件美学的场景下。

原文最后那句"this is the developer behind a game that actually runs on the original PlayStation"不是随口一提。它是在说:这个人对 PS1 的理解,已经通过了最严格的验证——他的代码真的在那台 1994 年的硬件上跑起来了。

软件技术GodotPS1渲染着色器复古游戏技术解析