Additive blending between two background layers: a static landscape with semi-transparent clouds scrolling over it. No input required.
Then open transparency.sfc in your emulator (Mesen2 recommended).
No interactive controls. The clouds scroll automatically.
The SNES PPU can blend two images together using its color math unit. The "main screen" is the final displayed image. The "sub screen" is a second, hidden rendering of selected layers whose pixel colors are used as the blend source.
In this example:
The color math unit takes each main screen pixel and adds the corresponding sub screen pixel color to it. Where clouds overlap the landscape, the cloud colors brighten the landscape beneath them. Where there are no cloud pixels, no addition occurs.
Mode 1 normally draws BG3 (2bpp) behind BG1 (4bpp). Setting BG3_MODE1_PRIORITY_HIGH promotes BG3's high-priority tiles above all other BG layers, which is essential for the cloud overlay to render on top of the landscape.
The COLORMATH_BACKDROP flag ensures clouds also blend over empty areas (CGRAM entry 0).
The tile data, tilemaps, and palettes live in SUPERFREE ROM sections that may land in any bank. C code cannot reliably specify bank bytes for cross-bank data, so data.asm provides a loadGraphics() routine that uses the :label syntax to get linker-resolved bank bytes at link time. All graphics are loaded during forced blank (screen off) since the total data exceeds the ~4KB VBlank DMA budget.
consoleInit() initializes the PPU and NMI handlerREG_INIDISP = 0x80) allows unlimited VRAM write timeloadGraphics() DMAs all tile/tilemap/palette data to VRAM and CGRAM$2000, tiles at $0000 (4bpp landscape)$2400, tiles at $1000 (2bpp clouds)Each frame, BG3's horizontal scroll is incremented by one pixel. The tilemap wraps naturally, creating seamless looping clouds:
bgSetScroll() defers the actual PPU register write to the NMI handler via a dirty-flag mechanism, ensuring scroll updates happen safely during VBlank.
| File | Purpose |
|---|---|
main.c | PPU setup, color math configuration, scroll loop |
data.asm | Assembly DMA loader + SUPERFREE graphics data |
Makefile | Build config, gfx4snes conversion rules |
res/backgrounds.bmp | 4bpp landscape source image |
res/clouds.bmp | 2bpp cloud overlay source image |
Window Masking: Window Example - Triangle-shaped HDMA window
HDMA Gradient: Gradient Colors - Per-scanline color effects