NDS에서 지원하는 최대 컬러로 그림을 그리는 방법입니다.
이 방법은
퀄리티를 추구하고, 사용방식이 DX draw 개념처럼 사용할 수 있지만, 단점으로 OAM과 동시에 사용하기가 힘듭니다. 그리고 속도도 느린편이고 VRAM 차지하는 용량도 많습니다
.

15bit
의 그림을 만들기 위해서는 포토샵 등에서는 지원이 안되고, 따로 툴을 제작해서 컨버팅을 시켜야 합니다
. (이와 관련 툴은 컨버팅 툴 포스트로..)

그전에 BMP파일 구조에 대해서 약간 생각해보면, 우선 24bit 컬러의 경우 파일 구조는 아래
와 같은 구조로 구성되어 있습니다.

사용자 삽입 이미지

각각의 Pixel data RGB 각각 8bit (총합 24bit)구성 되어 있으니,
RGB를 각각 5bit(총합
15bit) RGB값을 3bit씩 다운시켜 주면 됩니다.

위 방식을 근거로 파일 변환을 시킨 바이너리 파일을 이하 bin이라 하고,
이 파일을 읽기 위해 작업을 해야 합니다
.

NDS
에서 15bit 그림을 올릴 땐 2가지 방법이 동원됩니다
.

1. 직접 그리기

Nitro SDK에서 제공하는 인터페이스인
 
Memory Interface _ Direct Memory Access Copy(32bit)
방식으로 하는 방법.

이 함수를 사용하면 아주 간단하게 이미지를 뿌릴 수 있습니다

 

2. 프레임 버퍼 변수 사용하기
프레임 버퍼 변수를 사용하면 VRAM의 공간 제약이 사라집니다.
물론 NDS SDK H/W 지원이 안되고, 속도가 느려지는 단점이 있습니다
.
하지만 Direct Draw surface같은 개념이기 떄문에,
DX Draw
사용자는 쉽게 적응 됩니다
.

프레임 버퍼는

void* FrameBuffer = (u16*)(HW_LCDC_VRAM_A);
와 같이 선언하며, VRAM_A( VRAM 첫부분)를 포인터로 가르키는 뜻입니다.

화면을 2차원의 사각형 배열로 생각하지 않고, 1차원 메모리 차원으로 생각해야 하므로
수학공식을 잘 생각 및 활용해야 합니다.

그림 찍는 방법은 아래와 같은 함수로 생각할 수 있으며, 아래 함수의 경우, 투명색을 처리해줍니다
당연히 투명색을 찍고 싶지 않을땐, Trans_rgb 값을 NULL로 해주면 됩니다.

투명색을 빼고 그리는 함수

void Image_Class::TransparBlt(u32 Frame_Start_x, u32 Frame_Start_y,   
  
//
프레임 x,y좌표
   u32 Blt_Image_x, u32 Blt_Image_y,           
   
//
복사할 이미지 x,y좌표

                              u32 Blt_Width, u32 Blt_Height, u16 
                              Trans_rgb) //
복사그림 가로,세로,투명색

 {

u32 posY, posX;

int bitX, bitY;

RECT r;

u16 PrintPixel;

                          

r.left = Frame_Start_x;

r.top = Frame_Start_y;

r.buttom = Frame_Start_y + Blt_Height;

r.right = Frame_Start_x + Blt_Width;

 

for(posY = r.top, bitY = 0; posY < r.buttom ; ++posY, ++bitY)

{                         

            for(posX = r.left, bitX = 0; posX < r.right ; ++posX, ++bitX)

            {

               PrintPixel = m_pBmp[(bitY+Blt_Image_y) *  
                                  (m_iBmpWidth) + (bitX+Blt_Image_x)];

                 if(Trans_rgb != PrintPixel)

                   m_pFrameBuff[posY*(SCR_WIDTH) + posX] = PrintPixel;

            }                                                   
}

}

위의 함수는 2 for문을 돌면서, 해당위치에 점을 대입해서 찍는 방식.

장점으로는 저 프레임 버퍼를 DX Draw Real Serface라 생각, 넣어주면

DX Draw 처럼 구현이 됩니다.

하지만, 256BG와 비교하였을시, 1/6 ~ 1/2 정도 속도가 느려집니다.
(
실제 NDS상에서는 속도는 그림2개 정도 띄울 때 평범하다 싶을 정도 속도가 나옵니다.)


위의 2방법으로 그림을 메모리에 올린 후에는 현제 화면에 뜰 Video RAM이 어느 RAM 지역인지 알려줘야 합니다.

참고로 Sub화면에 15bit 그림을 그릴려면 Main LCD 와 Sub LCD의 화면을 바꿔주는 함수를 따로 추가 시켜야 합니다.


 

+ Recent posts