본문 바로가기
프로그래밍/PSP

[펌]PSP 프로그래밍 204 - Graphics: Texture프로그래밍/PSPSDK

by 베리베리 2008. 7. 28.
cube 샘플이 텍스쳐까지 다루고 있으므로 cube 샘플에서 넘어갔던 부분을 살펴 보도록 한다.

struct Vertex __attribute__((aligned(16))) vertices[12*3] =
{
   {0, 0, 0xff7f0000,-1,-1, 1}, // 0
   {1, 0, 0xff7f0000,-1, 1, 1}, // 4
   {1, 1, 0xff7f0000, 1, 1, 1}, // 5

   {0, 0, 0xff7f0000,-1,-1, 1}, // 0
   {1, 1, 0xff7f0000, 1, 1, 1}, // 5
   {0, 1, 0xff7f0000, 1,-1, 1}, // 1

   {0, 0, 0xff7f0000,-1,-1,-1}, // 3
   {1, 0, 0xff7f0000, 1,-1,-1}, // 2
   {1, 1, 0xff7f0000, 1, 1,-1}, // 6

   {0, 0, 0xff7f0000,-1,-1,-1}, // 3
   {1, 1, 0xff7f0000, 1, 1,-1}, // 6
   {0, 1, 0xff7f0000,-1, 1,-1}, // 7

   {0, 0, 0xff007f00, 1,-1,-1}, // 0
   {1, 0, 0xff007f00, 1,-1, 1}, // 3
   {1, 1, 0xff007f00, 1, 1, 1}, // 7

   {0, 0, 0xff007f00, 1,-1,-1}, // 0
   {1, 1, 0xff007f00, 1, 1, 1}, // 7
   {0, 1, 0xff007f00, 1, 1,-1}, // 4

   {0, 0, 0xff007f00,-1,-1,-1}, // 0
   {1, 0, 0xff007f00,-1, 1,-1}, // 3
   {1, 1, 0xff007f00,-1, 1, 1}, // 7

   {0, 0, 0xff007f00,-1,-1,-1}, // 0
   {1, 1, 0xff007f00,-1, 1, 1}, // 7
   {0, 1, 0xff007f00,-1,-1, 1}, // 4

   {0, 0, 0xff00007f,-1, 1,-1}, // 0
   {1, 0, 0xff00007f, 1, 1,-1}, // 1
   {1, 1, 0xff00007f, 1, 1, 1}, // 2

   {0, 0, 0xff00007f,-1, 1,-1}, // 0
   {1, 1, 0xff00007f, 1, 1, 1}, // 2
   {0, 1, 0xff00007f,-1, 1, 1}, // 3

   {0, 0, 0xff00007f,-1,-1,-1}, // 4
   {1, 0, 0xff00007f,-1,-1, 1}, // 7
   {1, 1, 0xff00007f, 1,-1, 1}, // 6

   {0, 0, 0xff00007f,-1,-1,-1}, // 4
   {1, 1, 0xff00007f, 1,-1, 1}, // 6
   {0, 1, 0xff00007f, 1,-1,-1}, // 5
};

Vertex 구조체에서 앞의 두개의 float 값이 texture mapping과 관련된 값이다. 이 두 값은 폴리곤의 꼭지점에 텍스쳐의 어느 부분을 맵핑할 것인지를 지정한다. 탄력이 있는 사각형의 얇은 천을 어떤 입체에 입히는데, 핀을 천의 어느 부분을 통해서 입체의 꼭지점에 꼽는 것이라고 생각하면 된다. 천의 왼쪽 아래가 (0, 0), 오른쪽 아래가 (1, 0), 왼쪽 위가 (0, 1), 오른쪽 위가 (1, 1)이고 천의 특정 위치는 0에서 1 사이의 실수로 지정할 수 있다. vertex들의 위치들을 그림을 그려가며 살펴보면 cube 샘플에서는 각 꼭지점이 사각형의 꼭지점이 되도록 지정하고 있는 것을 알 수 있다. 이 값들을 변경하면 텍스쳐가 입혀지는 방향이라던가 텍스쳐의 특정 부분만 입히게 한다던가 하는 일을 할 수 있다.

sceGuEnable(GU_TEXTURE_2D);

main 함수에서 렌더링 방식 설정 중에 GU_TEXTURE_2D를 활성화시켜서 텍스쳐를 사용 가능하도록 하고 있다.

sceGuTexMode(GU_PSM_4444,0,0,0);
sceGuTexImage(0,64,64,64,logo_start);
sceGuTexFunc(GU_TFX_ADD,GU_TCC_RGB);
sceGuTexEnvColor(0xffff00);
sceGuTexFilter(GU_LINEAR,GU_LINEAR);
sceGuTexScale(1.0f,1.0f);
sceGuTexOffset(0.0f,0.0f);
sceGuAmbientColor(0xffffffff);

텍스쳐를 어떻게 사용할지에 대해 설정하고 있는데, sceGuTexImage로 텍스쳐로 쓸 이미지를 지정하고 있다. logo_start에 대해서는 밑에서 다시 설명이 될 것이고, mipmap level로 0을 지정해 주고 있다. mipmap lavel이란 한 텍스쳐를 여러가지 해상도로 준비해 놓고 필요할 때 필요한 해상도로 보여주는 것으로 LOD (Level of Detail)에서 사용한다고 보면 될 것 같다. cube 샘플에서는 텍스쳐가 한 해상도 밖에 없으므로 0으로 지정해 주고, 가로, 세로 길이를 64x64로 지정해 준다. 네번째 인자는 텍스쳐 버퍼의 가로 길이를 나타낸다. sceGuTexFunc와 sceGuTexEnvColor에서는 텍스쳐가 어떻게 적용될지를 지정하는데 여기 들어갈 값들은 나중에 천천히 살펴 보도록 한다. sceGuTexFilter에서는 텍스쳐가 필터링되는 방법을 지정하는데 cube 샘플에서는 max값과 min값을 모두 GU_LINEAR로 주어서 텍스쳐 적용의 결과가 좋게 나오도록 하고 있다. sceGuTexScale로는 텍스쳐의 크기를 변화시킬 수 있고, sceGuTexOffset으로는 텍스쳐의 일정 부분만을 사용할 수 있으나, 이 샘플에서는 모두 기본값을 주어서 변화를 주지 않고 있다.

이렇게 해 주면 렌더링될 때 텍스쳐가 적용되어서 렌더링된다. 그러면, 실제 사용된 텍스쳐는 어디 있을까? logo_start가 텍스쳐 정보를 담고 있는 포인터인데, 이 logo_start는 다음과 같이 extern으로만 되어 있다.

extern unsigned char logo_start[];

logo_start가 실제로 어디에 있는가를 알기 위해서는 Makefile과 bin2o라는 실행파일을 알아야 한다. 샘플에는 원래 logo.raw라는 파일이 함께 있었다. 이 파일은 어떠한 헤더나 부가 정보도 없이 bitmap 정보만을 담고 있는 raw bitmap 파일이다. 이 파일을 bin2o라는 바이너리 파일을 ELF 형식의 object 파일로 변환해 주는 툴을 이용해서 logo.o로 변환한 다음 함께 링크한 것이다. bin2o는 원본 파일의 이름 뒤에 _start를 붙여서 심볼을 만드므로 cube.c에서는 logo_start를 extern으로 사용하고 있는 것이다. Makefile의 내용을 보면 logo.o를 만들기 위해서는 bin2o를 사용하라는 것을 볼 수 있다.

TARGET = cube
OBJS = cube.o logo.o ../common/callbacks.o ../common/vram.o

INCDIR =
CFLAGS = -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LDFLAGS =
LIBS= -lpspgum -lpspgu -lm

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Cube Sample

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

logo.o: logo.raw
   bin2o -i logo.raw logo.o logo

16비트로 align된 비트맵 정보를 만들 수 있다면 이 샘플처럼 raw bitmap을 bin2o로 변환해도 되고, 아예 소스에 박아넣어도 되고, 다른 그림 파일을 읽어들여도 상관없다.


이제 폴리곤에 텍스쳐까지 입힐 수 있게 되었다, 축!

출처 : http://www.onlinegamer.co.kr/ 지금은 사라져서;; 공개해두 괜찮을지;;;

댓글