275. 使用 NES 调色板的图案表

使用默认的 NES RGB 调色板渲染图案表帧缓冲。

275 / 356 · tests/chapter_05_rendering_pipeline/test_275_pattern_table_with_nes_palette.py

待更新的文件

emulator/rendering/pattern_table_renderer.py

为什么需要这一步

通用的图案表渲染器已经支持自定义调色板

pattern_table_to_framebuffer(pattern_table_bytes, palette)

这在测试和调试调色板中很有用。现在我们有了默认的 NES RGB 调色板近似值,于是我们添加一个便捷的辅助函数:

pattern_table_to_nes_framebuffer(pattern_table_bytes)

这个辅助函数让默认调色板路径更加明确,同时不移除对自定义调色板的支持。

它应该做什么

pattern_table_to_nes_framebuffer(pattern_table_bytes)
    -> pattern_table_to_framebuffer(pattern_table_bytes, NES_PALETTE_RGB)

建议的实现示例

from emulator.rendering.nes_palette import NES_PALETTE_RGB


def pattern_table_to_nes_framebuffer(
    pattern_table_bytes: bytes,
) -> Framebuffer:
    return pattern_table_to_framebuffer(pattern_table_bytes, NES_PALETTE_RGB)

为什么不把 NES_PALETTE_RGB 设为默认参数?

这样做也是可行的

def pattern_table_to_framebuffer(pattern_table_bytes, palette=NES_PALETTE_RGB):
    ...

但对于教程来说,用单独的辅助函数会更清晰

pattern_table_to_framebuffer(..., palette)
    custom palette path

pattern_table_to_nes_framebuffer(...)
    default NES palette path

注意:本测试只使用合成的 CHR 字节,不要在本测试中使用商业 ROM 的 CHR 数据。

本步骤不涉及

  • pygame 显示
  • 写入图像文件
  • 名称表/背景渲染
  • PPU 调色板 RAM 查找
  • PPUMASK 强调颜色
  • 精灵

运行本课

uv run pytest tests/chapter_05_rendering_pipeline/test_275_pattern_table_with_nes_palette.py -v