277. 使用 NES 调色板的名称表

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

277 / 356 · tests/chapter_05_rendering_pipeline/test_277_nametable_with_nes_palette.py

待更新的文件

emulator/rendering/nametable_renderer.py

为什么需要这一步

通用的名称表渲染器支持自定义调色板

nametable_to_framebuffer(nametable_bytes, pattern_table_bytes, palette)

这在测试和调试调色板中很有用。现在我们有了 NES_PALETTE_RGB,于是我们添加一个使用默认调色板的辅助函数:

nametable_to_nes_framebuffer(nametable_bytes, pattern_table_bytes)

这与上一个渲染步骤中的图案表辅助函数是对应的。

它应该做什么

nametable_to_nes_framebuffer(nametable_bytes, pattern_table_bytes)
    -> nametable_to_framebuffer(
           nametable_bytes,
           pattern_table_bytes,
           NES_PALETTE_RGB,
       )

建议的实现示例

from emulator.rendering.nes_palette import NES_PALETTE_RGB


def nametable_to_nes_framebuffer(
    nametable_bytes: bytes,
    pattern_table_bytes: bytes,
) -> Framebuffer:
    return nametable_to_framebuffer(
        nametable_bytes,
        pattern_table_bytes,
        NES_PALETTE_RGB,
    )

重要的简化

这里仍然对每个图块使用同一个共享调色板,尚未解码 64 字节的属性表,也还没有读取 $3F00-$3F1F 处的 PPU 调色板 RAM。这可以作为一个实用的调试/简单渲染器。之后的渲染器会使用属性表在不同的背景调色板之间进行选择。

重要的测试数据规则

只使用合成的名称表/CHR 字节,不要在本测试中使用商业 ROM 数据。

本步骤不涉及

  • 属性表调色板选择
  • PPU 调色板 RAM 查找
  • 滚动
  • 精灵
  • OAMDMA
  • pygame 显示

运行本课

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