跳轉到內容

超級任天堂程式設計/圖形教程

來自華夏公益教科書

本教程將介紹如何將瓦片對映到 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

瓦片地圖

[編輯 | 編輯原始碼]
華夏公益教科書