跳转到内容

超级任天堂编程/图形教程

来自维基教科书,开放世界中的开放书籍

本教程将介绍如何将瓦片映射到 SNES 背景。

为了渲染背景,程序必须为每个背景设置一些东西,请记住为每个要渲染的背景设置这些东西

  • BG 模式(影响平面数、位深度),在寄存器 0x2105 中设置
  • 瓦片大小(8x8 或 16x16),在寄存器 0x2105 中设置
  • 设置背景地图
  • 设置背景瓦片集

瓦片地图

[编辑 | 编辑源代码]

地图是一个二维数组(32x32、64x32、32x64 或 64x64)的瓦片索引。SNES 遍历数组,并为地图中的每个索引渲染数组中指定的瓦片。由于瓦片可以是 8x8 或 16x16 像素,因此最终的背景图像尺寸可以从 256 到 1024 像素(地图大小 * 瓦片大小)。

数组中的一个成员是一个 2 字节长的结构(2 字节长 = 16 位)

高字节 低字节

vhopppcc cccccccc

  • c 是瓦片集中的瓦片索引(瓦片集按 BG 指定),SNES 将获取瓦片的地址为(base_tileset_bits << 13)+(8 * color_depth * tile_number)
  • h:水平翻转
  • v:垂直翻转
  • p:调色板编号
  • o:优先级位

使用寄存器 $2107-$210A 为你的背景设置地图。

寄存器 $2107-$210A 的结构

aaaaaass

a:VRAM 中地图的地址。将该数字乘以 2048(或左移 11 位)以获得地图的字节位置。

s:地图的大小

* 00=32x32 
* 01=64x32
* 10=32x64 
* 11=64x64


如果地图的尺寸大于 32(例如 64x32),数组每行不会有 64 个瓦片索引,而是会在 VRAM 中将两个 32x32 地图依次存储。第一个地图(32x32 瓦片 = 2*32*32 字节)将代表地图的左侧,第二个地图(与第一个地图相同大小)将代表地图的右侧。

瓦片集

[编辑 | 编辑源代码]

瓦片是一个小的 8x8 或 16x16 图像,用于构建更大的图像。


Clipboard

待办
在此期间,请阅读:http://www.geocities.com/Qwertie256/attic/snesemu/qsnesdoc.html


技术信息

[编辑 | 编辑源代码]

为了使用 SNES 的 PPU,必须确切了解它是如何处理图形数据的。

位深度

[编辑 | 编辑源代码]
  • 模式 0:4 色,2 位每像素(bpp)
  • 模式 1:8 色,3 bpp(你可能在一些瓦片编辑器中看到过,但 SNES 不显示 3bpp 图形。它们必须在使用之前扩展到 4bpp 格式。)
  • 模式 2:16 色,4 bpp
  • 模式 3:128/256 色,8bpp(仅在模式 7 中)

瓦片格式

[编辑 | 编辑源代码]

SNES 对其瓦片数据使用奇数交错格式。考虑这个带调色板的“x”图案

瓦片数据本身将由这些字节组成

.db $00, $81, $81, $42, $C3, $24, $E7, $18, $E7, $18, $C3, $24, $81, $42, $00, $81

"这到底是如何对应于该瓦片的?" 我听到你在想。

像素的每一行由两个字节表示。取第一行($00,$81)。它包含颜色 2,0,0,0,0,0,0,2。以二进制形式

0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 1 

字节 0 中的每个位都等效于它对应像素中的 0。取下一行($81,$42)

12000021        colors,
10000001	$81, 
01000010	$42,

你可能听说过位平面。它们表示对应于所有像素的位?'的字节集,其中 ? 是从 0 到每像素位的数量减 1。因此,在本例中,位平面 0 将指瓦片数据中的奇数字节($00,$81,$C3 等)。

这有道理吗?我自己也不太确定..

调色板格式

[编辑 | 编辑源代码]

SNES 的颜色每个都是 15 位,并以 bgr 格式存储。

?bbbbbgg gggrrrrr

颜色全绿 像这样 将存储为

%00000011, %11100000

以十六进制表示

$03, $E0

调色板只是颜色数组。上面显示的调色板将存储在 ROM 中为(一种颜色为“$xx,$xx”)

.db $EE, $00, $10, $02, $4A, $01, $00, $00

瓦片地图

[编辑 | 编辑源代码]
华夏公益教科书