273. Таблица шаблонов во фреймбуфер
Рендеринг отладочной сетки таблицы шаблонов во фреймбуфер.
Урок 273 из 356 · tests/chapter_05_rendering_pipeline/test_273_pattern_table_to_framebuffer.py
Файл для создания
emulator/rendering/pattern_table_renderer.pyПочему этот шаг важен
В эмуляторе уже есть чистые вспомогательные функции CHR
decode_pattern_table(pattern_table_bytes)
-> 256 decoded 8x8 tiles of color indexes
build_pattern_table_debug_grid(decoded_tiles)
-> 128x128 color-index debug gridА в конвейере рендеринга теперь есть
color_index_grid_to_framebuffer(grid, palette)
-> RGB FramebufferЭтот шаг объединяет эти элементы в одну чистую вспомогательную функцию
pattern_table bytes + RGB palette -> 128x128 FramebufferЧто такое отладочный фреймбуфер таблицы шаблонов? Таблица шаблонов содержит 256 тайлов. Каждый тайл имеет размер 8x8 пикселей. Для отладки мы располагаем эти тайлы следующим образом:
16 tiles across * 8 pixels = 128 pixels wide
16 tiles down * 8 pixels = 128 pixels highПример возможной реализации
from emulator.ppu.chr_decoder import (
build_pattern_table_debug_grid,
decode_pattern_table,
)
from emulator.rendering.color_index_renderer import color_index_grid_to_framebuffer
from emulator.rendering.framebuffer import Framebuffer, RGBColor
def pattern_table_to_framebuffer(
pattern_table_bytes: bytes,
palette: list[RGBColor],
) -> Framebuffer:
decoded_tiles = decode_pattern_table(pattern_table_bytes)
grid = build_pattern_table_debug_grid(decoded_tiles)
return color_index_grid_to_framebuffer(grid, palette)Архитектурное правило
Этот рендерер должен объединять уже существующие чистые функции. Не дублируйте здесь логику декодирования CHR.
Важное правило для фикстур
Используйте только синтетические байты CHR. Не используйте в этом тесте данные CHR из коммерческих ROM.
Вне рамок этого шага
- отображение через pygame
- запись файлов изображений
- рендеринг таблицы имён
- поиск в палитровой RAM
- рендеринг спрайтов
Запустить этот урок
uv run pytest tests/chapter_05_rendering_pipeline/test_273_pattern_table_to_framebuffer.py -v