yaba2新喜讯,又解决一个问题
世嘉土星吧
全部回复
仅看楼主
吧务
level 9
索尼克R 楼主
重建VDP2 — 按像素在真实硬件顺序下重现 Saturn 的“读取和合成”管道
Yabasanshiro 是一个使用现代 GPU 来以高分辨率和高速度运行 Sega Saturn 游戏的模拟器。
在最近的一篇帖子中,我描述了如何使用计算着色器重新构建VDP1处理器——这个处理器负责绘制精灵和多边形。这次的故事是关于另一个视频处理器:VDP2,它负责处理背景和半透明效果。我从头开始重新构建了它的模拟。
先前的设计及其问题
到目前为止,Yabasanshiro 通过“将纹理粘贴到多边形上并绘制它们”来模拟 VDP2 的每个背景层(NBG0-3,RBG0)。这是在现代 GPU 上渲染图形的最常见方法。
现代的 GPU 内置了 alpha blending、深度测试和模板测试。使用这些功能,您可以将半透明效果和前后顺序排序卸载到专用硬件上,并且运行速度非常快。
但是,土星有几种硬件特定的行为,仅靠现代 GPU 的内置功能是无法重现的。
过于透明 —— 它与普通透明混合有何不同
现代GPU的透明混合可以依次堆叠任意数量的半透明图像。另一方面,土星的颜色计算通常在仅仅两个图像之间进行——最前面的像素和在其之后的下一个优先级的像素。
如果你忽略这个差异,并且按照现代GPU的默认方式混合,本应停止在两层的透明效果最终会渗透到更多层,结果就会变得 过于透明。
例如,在《毁灭战士》中,半透明效果过于强烈:你可以直接看到墙壁后面的背景。
目的地 alpha —— 不是“已经写入的值”,而是“下一个优先级的值”
一些游戏如《樱花大战》使用了目的地阿尔法(Destination Alpha)这一功能。它通过使用位于该像素优先级下方的像素设置使像素变得半透明。
要再现这一点,你必须在绘制时引用“其下的像素值”。
而这里就与现代GPU存在根本性的不匹配。GPU的混合操作唯一能引用的是已经写入帧缓冲区的值。VDP2,然而,是使用下一个优先级图像的值进行计算的——而不是已经写入的值。这使得它很难直接映射到GPU模型上。
按像素,而不是按图层——特别优先
如果优先级是按层(按表面)决定的,仍然有方法应对——你可以只是重新排序这些层。
但是 VDP2 有一个叫做 特殊优先级的功能,其中优先级会 逐像素变化。即使在一个图层内,从前景到背景的顺序也会从一个像素到下一个像素交换,因此仅仅重新排序整个图层是不够的。
在《阿兹尔(Panzer Dragoon Saga)》中,菜单背景——应该不透明——被渲染成半透明。
扩展颜色计算 — 使用第三和第四优先级
VDP2 还具有扩展的色彩计算功能,该功能在合成色彩时不仅考虑最优先(Top)和次优先(Second),还考虑第三和第四优先。
普通颜色计算完成后会有两张图像,而扩展颜色计算则会合并最多四张图像的颜色。在Luna的消息显示中,这一点没有正确处理,导致文本区域呈现出淡紫色。
为什么会这样大的差异?
那么为什么VDP2和现代GPU一开始就会如此不同步呢?因为它们的处理方向相反。。
一个现代GPU的渲染最终通过将颜色写入内存(帧缓冲区)来完成。
是否进行深度/模板测试 → 写入深度/模板缓冲区
如何在书写时决定颜色 → alpha blending
在该过程中,它只能引用已经写入的值。
VDP2 的原始角色是读取内存并将其转换为模拟视频信号。 该角色的扩展:
决定从内存的哪个位置读取 → 优先级
决定如何将读取的值与“其他优先级的像素”结合 → 颜色计算
换句话说,GPU在“写”方向处理,而VDP2在“读”方向处理。这种相反的方向是导致VDP2模拟如此困难的根本原因。
“Modern”在2013年和2026年的含义是不同的。
我所描述的“现代GPU”是大约2013年的GPU,那时我开始为Android构建Sega Saturn模拟器。那个时代的移动GPU优化了尽可能快地绘制三角形,而擅长“读取之前已经绘制的内容”。这就是为什么直接将VDP2映射到多边形渲染,并用修正来填补空白是实际的选择。
但在2026年,情况看起来会非常不同。
多重渲染目标(MRT)和G缓冲区——这种机制可以一次性写入多层信息,并允许你在之后自由读取——已经成为移动设备上的标准配置。
以这个为基础,设计VDP2的“阅读方向”处理完全可行,不需要依赖强制修正。所以这次我从头开始重建了VDP2。
新设计 — 通过扫描线处理逐像素合成
新的VDP2模拟基于逐行处理,因此操作尽可能按照真实硬件的顺序进行。
工作分为两个主要阶段。
1. 将每一层解码到“G缓冲区”
首先,每个图层(NBG0–3、RBG0 和精灵图层)分别渲染到各自的专用缓冲区(切片)中。此阶段不进行合成(颜色计算)。对于每个像素,我们只记录颜色以及优先级、是否启用颜色计算、计算比例和像素是否透明等属性。
2. 像素合成
接下来,整个屏幕在一个着色器中进行处理。对于每个像素:
读取所有图层,按优先级排序(从高到低,7→1),并确定最前面的、第二个、第三个和第四个像素。
对识别出的像素进行颜色计算,顺序与实际硬件相同。
应用线条颜色和颜色偏移来确定输出颜色。
该序列确定最终颜色。
因此,我们之前不得不通过修正来模拟的处理现在可以使用其正确的逻辑来实现。通过这次重建,VDP2的核心颜色计算和合成功能现在基本完成(大约90%)。
特征 状态
测试结果
通过新方法,以下长期存在的问题已经得到解决或改善。在每张图像中,左边是修复前,右边是修复后。
Doom — 修复墙壁过于透明的问题
解决了透明度过强以至于可以看到它们后面墙壁背后背景的问题。
Luna — 修复了文本的紫色色调
解决了消息区域文本呈现淡紫色的问题。通过按正确顺序运行扩展颜色计算,颜色已恢复正常。
Azel — 修复了半透明菜单背景
解决了菜单背景应该不透明却渲染成半透明的问题——多亏了能够正确处理每个像素的特殊优先级。
Sonic R — 修复了海洋混合效果
解决了海洋表面混合不正确的问题。
这类问题之前一直都没解决,让好些游戏颜色看起来不准确,
现在如果能解决的话,就很棒了,3D方面应该还要慢慢修复很久,声音,手柄也需要慢慢修。
希望能感受到土星本来想呈现但受机能限制的3D美丽画面,加油啊 哑巴三四郎。
2026年06月08日 04点06分 1
level 11
yaba老大难天外魔境图层问题看来有望修复?
2026年06月08日 06点06分 2
很有可能解决,但是2D游戏其实有很多选择。
2026年06月08日 06点06分
吧务
level 9
索尼克R 楼主
2026年06月08日 06点06分 3
level 8
yaba安卓新版一直没破解版
2026年06月08日 07点06分 4
level 6
对于这个模拟器,非常赞!
2026年06月10日 13点06分 5
1