-
(챕터 03) 이미지 파일을 사용하자(2)@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2014. 3. 1. 18:35
이미지의 높이와 폭을 읽어보자.
사양서에 따르면
dwHeight가 8바이트째부터 4바이트
dwWidth가 12바이트째부터 4바이트
그런게 맨 처음에 나온 dwMagic(4바이트) 크기를 더하면 최종
dwHeight가 12바이트째부터 4바이트
dwWidth가 16바이트째부터 4바이트가 원하는 값이 된다.
char* fileImage; //여기에 DDS파일을 읽어왔다면..
unsigned height, width;height=*(reinterpret_cast<unsigned int*>(&fileImage[12]));
width=*(reinterpret_cast<unsigned int*>(&fileImage[16]));char*를 강제로 unsigned*로 변환해서 unsigned를 추출하는데 그 이유는 DWORD가 unsigned이기 떄문이다.
(DWORD dwHeight, DWORD dwWidth 이므로..)
책에서는 강제로 다른형의 포인터로 바꿔 읽는것은 좋지 않다고 이야기한다. 그러면서 세가지 기능을 이야기 하는데
1. 캐스트(static_cast, const_cast, reinterpret_cast, dynamic_cast)
2. 얼라인먼트
3. 엔디안(리틀엔디안, 빅엔디안)
개인적으로 책내용도 보고 찾아봐야 이해가 된다.
어쩄든..책에서는 4바이트의 값을 원해서..아래와 같은 함수를 만들게 된다.
unsigned int getUnsigned(const char*p)
{
const unsigned char* up;
up=reinterpret_cast<const unsigned char*>(p);
unsigned ret=up[0];
ret|=(up[1]<<8);
ret|=(up[2]<<16);
ret|=(up[3]<<24);
return ret;
}char* fileImage; //여기에 DDS파일을 읽어왔다면..
unsigned height, width;height=getUnsigned(&fileImage[12]);
width=getUnsigned(&fileImage[16]);이렇게 하여 이미지의 높이와 폭을 구한다.
그 다음 이미지의 높이와 폭을 구했으면 픽셀을 구해서 그 크기에 맞게 뿌려주면된다.
사양서에 따르면 DDSURFACEDESC2크기는 124바이트 dwMagic 4바이트를 더한 128바이트까지가 포멧정보와 기타들..128이후가 픽셀이 들어있다.
unsigned* image=new unsigned[width*height];
for(unsigned i=0;i<width*height;i++){
image[i]=getUnsigned(&fileImage[128+i*4]);
}책에서는 4바이트씩 진행하므로 [128+i*4]라고 한다.
근데 왜 4바이트 (128+i*4)씩 진행을 해야하나? 그 이유는 데이터 본체는 unsigned 배열이고 여기서 다루는 dds는 32비트라 한다...
이미지를 화면에 표현은
unsigned* vram=videoMemory();
후
vram[y*windowWidth+x] = image[y*imagewidth+y];
이런식으로..(책보면 이해감..)
'@ 16. 1 ~ 17. 1 > 게임프로그래밍의 정석' 카테고리의 다른 글
혼합공식 (0) 2014.07.23 (챕터 06) 문자를 출력하는 방법 (0) 2014.03.02 싱글톤 클래스 (0) 2013.05.06 (챕터 03) 이미지 파일을 사용하자 (0) 2013.04.24 (챕터 02) 점에서 시작하는 2D그래픽(2) (0) 2013.04.24