335. Viewport de fondo de la PPU a máscara de opacidad
Compone el viewport de la máscara de opacidad horizontal a partir del estado de desplazamiento actual de la PPU.
Lección 335 de 356 · tests/chapter_13_scrolling/test_335_ppu_background_viewport_to_opaque_mask.py
Archivo a actualizar
emulator/rendering/ppu_background_renderer.pyReferencias
https://www.nesdev.org/wiki/PPU_scrolling
https://www.nesdev.org/wiki/PPU_nametablesPor qué esto se parece al paso 334
El adaptador de la máscara de opacidad copia deliberadamente la estructura de direccionamiento del adaptador del framebuffer:
decode the same viewport X
select the same horizontal logical pair
process the same left and right bases
compose using the same viewport XLa diferencia importante es que cada operación que produce datos debe usar la ruta de la máscara de opacidad:
ppu_background_to_opaque_mask()
compose_horizontal_opaque_mask_viewport()No debe llamar accidentalmente a
ppu_background_to_framebuffer()
compose_horizontal_framebuffer_viewport()Esta copia deliberada mantiene ambas rutas fáciles de leer. Sus pruebas de paridad evitan que el pequeño mecanismo de direccionamiento duplicado diverja.
La máscara resultante se compartirá más tarde entre la prioridad de sprites y la detección de sprite-zero-hit. Este paso solo la construye; no integra ninguno de los dos consumidores.
Fuera del alcance
- composición del framebuffer
- integración en Console
- integración del sprite-zero-hit
- desplazamiento vertical por píxeles
- pygame
Implementación de ejemplo completa
# emulator/rendering/ppu_background_renderer.py
# --- NEW BLOCK: COPY FRAMEBUFFER ADDRESSING FOR THE OPACITY-MASK PATH ---
def ppu_background_viewport_to_opaque_mask(
ppu: PPU,
) -> BackgroundOpaqueMask:
viewport_x, _ = decode_background_viewport_position(
temp_vram_addr=ppu.temp_vram_addr,
fine_x=ppu.fine_x,
)
nametable_y = (ppu.temp_vram_addr >> 11) & 1
left_base = BASE_NAMETABLE_ADDR + nametable_y * 0x0800
right_base = left_base + 0x0400
# Same addresses, but call the opacity-mask producer.
left = ppu_background_to_opaque_mask(
ppu,
base_nametable_addr=left_base,
)
right = ppu_background_to_opaque_mask(
ppu,
base_nametable_addr=right_base,
)
# Use the opacity-mask compositor, not the framebuffer compositor.
return compose_horizontal_opaque_mask_viewport(
left=left,
right=right,
viewport_x=viewport_x,
)Ejecutar esta lección
uv run pytest tests/chapter_13_scrolling/test_335_ppu_background_viewport_to_opaque_mask.py -v