ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (챕터 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];

    이런식으로..(책보면 이해감..)

Designed by Tistory.