사실 위의 15bit 그림 그리는건 게임의 OP, ED, Title, Event 그림 이외엔 전혀
쓸모가 없다고 생각합니다
. 게다가 H/W 제한상(SDK 제한도 있습니다)
15bit
그림을 위아래 화면 동시 띄우는것이 힘듭니다
.

2화면 동시에 그리고 하드웨어적인 속도를 보장받기 위해 256컬러를 사용합니다.
256
컬러 이하는 24bit구조와 차이점이 있고, 우리가 필요로 하는 데이터는 아래
그림과 같습니다
.

사용자 삽입 이미지

위의 구조에서 중요한건 팔레트 데이터 입니다.
팔레트 데이터를 위의 24bit RGB 15bit RGB 다운 시킨 것처럼 비트 다운
시켜 주면 됩니다.


#define RGB15(r,g,b) (u16)(r|g<<5|b<<10) // RGB 15bit 변환 컬러

여기서, 팔레트 데이터가 흰색~검은색 까지 모든 색상의 대표색 256개가 지정된 것이 아니고
, 그림에서 사용하는 대표적인 256색만 사용합니다.

DS
에서 256BG를 띄우는데 3가지 데이터가 필요합니다.

Data

역 할

자료형

픽셀(타일)데이터

해당픽셀에 어떤색이 들어가는지 가르키는 값

u8

팔레트 데이터

이 그림에서 사용하는 색

u16

맵 데이터

위의 그림을 타일로 쪼개서 중복을 최대한 피하는 data

u16

 

각각 데이터에 따른 설명으로

Data

설 명

픽셀(타일)데이터

PC BMP파일의 픽셀 데이터를 그대로 옮기되, 출력을 8x8 tile형식으로 맞춰서 u8 데이터 형식, unsigned char 형식으로 맞춰야 합니다

팔레트 데이터

PC BMP파일의 팔레트 데이터를 옮겨오되, 위에서 설명했듯, NDS 최대 컬러수인 RGB15bit를 맞추기 위해 원래 24bit 팔레트 컬러를 각각 3bit bit down 시켜 줍니다

맵 데이터

사용자 삽입 이미지


NDS그림 H/W 그림 처리 방식은 독특한 방식으로 되어있습니다



위 그림은 NDS에서 그림처리를 하는 방식을 보여주는 극단적인 예라 할 수 있습니다. 격자모양의 사각형이 1개의 타일입니다.
맨 좌측 상단부터 1tile로 들어가며, 256x192 그림의 경우 32x24 타일로 구성이 됩니다
.
타일 구성의 이유는 위 그림에서 보듯 선택된 영역

(
노란, 청색 테두리 타일)이 단 2Tile로 처리가 가능하기에 별 다른 알고리즘 없이 압축효과를 볼 수 있습니다
그리고 이 맵 데이터를 조작함으로서 그림 스크롤 및 여러 효과를 나타내는것이 가능합니다.

 

타일 개념이 생소한 개념이므로 좀더 추가 설명을 하겠습니다.


사용자 삽입 이미지

위의 모자이크 같은 부분(64x64픽셀) Data 형식

extern const u8 sp_data[4096] = {

//Tile number 0

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,

 

//Tile number 1

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,

0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
//
이하 중략

//Tile number 62

0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,

0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,

0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,

0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,

0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,

0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,

0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,

0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,

 

//Tile number 63

0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,

0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,

0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,

0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,

0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,

0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,

0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,

0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,

 

};

 

위의 Data소스 sp_data[x]는 그림 픽셀 좌표입니다.
Tile number의 픽셀 Data 뭉치는 PC BMP파일로 따지면 1Line 입니다.
(
그림이
64x64)
하지만 NDS의 그림 로드는 위의 소스처럼, 8x8의 한 타일을 먼저 찍고,
그 다음 옆으로 이동하는 것을 알 수 있습니다.

 

 

BG를 띄우는 순서는
1. VRAM 초기화
2. BG올라갈 VRAM 할당
3. 해당 메모리 번지로 그림 픽셀 데이터 올림
4. 팔레트 데이터 올림
5. 픽셀 데이터를 조합해서 만드는 맵 파일을 올림
6. 출력될 BG 선택
   - 여려 효과 등은 BG2,3에서 지원

기서 투명색에 관해서 입니다. 투명색은 0번 팔레트를 사용합니다.
, 256컬러를 사용하기 보다는 투명색을 염두해서 255컬러를 사용하는 것이 현명하다고 생각합니다
.

포토샵등 툴에서 이런 제약을 가할 수 있으므로 그래픽 처리할 때 이점을 주의하는 것이 좋다고 생각합니다

Sub 출력은 Main LCD와 크게 다를것이 없습니다.
하지만 최대 128KB(VRAM_C) 만 할당이 가능하고,
(MAIN LCD
VRAM_ ABCD, 512KB 가능
)
약간 함수명이 다를뿐 크게 차이가 있지 않습니다.

+ Recent posts