언어 [DX&C++] 3D를 넘어 2D로!
2007.04.11 07:43
안녕하세요 제프입니다.
제목이 조금 이상하죠? 3D 프로그래밍이 2D 상위에 있을 것 같은데 뒤바뀐 듯한 느낌이 드실 것입니다.
하지만, 요즘 2D 이미지는 3D 공간상에 이미지를 띄우고, RHW 변환을 수행하여 화면에 뿌려주는 방식입니다.
즉, 원근감이 없는 3D 공간이라고 보면 됩니다.
사실 DirectX 9이 나오기 전까지는 저 변환을 일일히 수행을 해주었어야 했습니다. 참 귀찮은 일이며, 공부할 거리가 늘어나는 사태에 학생들은 울부 짖었지요.
DirectX 9은 ID3DXSprite 객체를 이용하여 아주 간단하게 그림표시가 가능하답니다.
이 객체를 초기화 하는 방법을 알려드리겠습니다.
LPDIRECT3DDEVICE9 g_pd3dDevice;
ID3DXSprite* g_pd3dSprite;
LPDIRECT3DTEXTURE9 g_pTexture = NULL;
라고 선언해주면 되는데, g_pd3dSprite가 그림을 그려줄 객체이고, g_pTexture는 실제로 그림을 저장할 객체입니다.
저번에 살펴본 기본 프로그램 내에 있는 InitD3D 함수에서 초기화한 LPDIRECT3DDEVICE9 객체를 이용해
D3DXCreateSprite (g_pd3dDevice,&g_pSpriteDevice);
이런 방식으로 초기화 해주시면 됩니다. 즉, 이것을 InitD3D 함수 밑에 넣어주시면 되지요.
이후, InitD3D와 InitVB 함수 사이에 InitObject 라는 함수를 만들고, 그림을 불러와보도록 하겠습니다.
D3DXCreateTextureFromFile(g_pd3dDevice, "test.png", &g_pTexture);
이 함수는 HRESULT 값으로 성공결과를 알려주므로, FAILED 함수로 실패여부를 검사할 수 있습니다.
"그림의 로딩에 실패했습니다." 라는 메세지를 띄워주면 좋을 것 같네요.
이후 Render 함수에 g_pd3dDevice->BeginScene() 이 속해있는 if 블록이 있을 것입니다.
이 블록 최 하단에, 다음과 같은 코드를 추가해주세요.
g_pSpriteDevice->Begin( D3DXSPRITE_ALPHABLEND );
D3DXMATRIX position;
D3DXMatrixIdentity(&position); // 행렬초기화
g_pSpriteDevice->SetTransform(&position); // 위치지정
g_pSpriteDevice->Draw(g_pTexture, NULL, NULL, NULL, D3DXCOLOR(1,1,1,1) ); // 그림 그리기
g_pSpriteDevice->End();
참 쉽죠?
ID3DXSprite 객체는 d3dDevice와 마찬가지로, SetTransform 을 통해 행렬을 받아 위치조정을 하게 됩니다.
즉, 회전, 크기변환, 위치이동 모두 3D와 같은 함수를 사용하게 되며, 최종적으로 그릴때 D3DXCOLOR 값으로 색상을 변화시킬 수 있습니다.
다음에는 이 스프라이트를 이용하여 글자를 새겨넣는 작업을 해보도록 하겠습니다.
댓글 13
-
힙합스타이너
2007.04.18 09:26
그냥..버텍스 생성하고 거기에 텍스쳐 입히면 되지 않나요?|+rp2+|2862|+rp3+|acoc_board_ideatip -
Zeprod
2007.04.18 10:21
버텍스에 텍스쳐를 입히고, 적절한 처리후 출력하는 방식으로는 빌보드라는 방식이 있습니다.
DX의 스프라이트 객체는 이 빌보드 처리보다 간단하게, RHW 좌표계를 사용한 그래픽 출력을 최대한 단순하게 만들어준 객체라고 보면 됩니다. |+rp+|2862|+rp2+|2863|+rp3+|acoc_board_ideatip -
아란
2007.04.27 21:54
좋은 강의 잘 보고 가요^^|+rp2+|2874|+rp3+|acoc_board_ideatip -
Zeprod
2007.04.30 06:50
오늘은 잠이 솔솔 오네요. 내일 눈이 떠지기를 바라면서 봉인. |+rp+|2874|+rp2+|2886|+rp3+|acoc_board_ideatip -
난_인간이다
2007.04.30 20:51
근데 왜 창도 소모임이 안들어가질까요 '_'?? 나만그런가-ㅅ-;;
zeprod님 차라리 공짜계정으로 간단하게 게시판 만들어서 강좌 올리심이 어떠세요? :)|+rp2+|2888|+rp3+|acoc_board_ideatip -
난_인간이다
2007.04.30 20:52
제가 pmp로 인터넷을 하기땜시 창조도시에 글을 못올리기도 하고 해서 ._.;;ㅎ(댓글은 되지만.) |+rp+|2888|+rp2+|2889|+rp3+|acoc_board_ideatip -
Zeprod
2007.04.30 22:52
창도 소모임 전체가 날아간걸로 알고 있어요.
저번 해킹 문제인지... |+rp+|2888|+rp2+|2892|+rp3+|acoc_board_ideatip -
난_인간이다
2007.05.01 09:19
근데 리눅스에선 다이렉트 못쓰나요?|+rp2+|2893|+rp3+|acoc_board_ideatip -
Zeprod
2007.05.01 13:11
리눅스에서는 따로 DX 같은 인터페이스가 필요없습니다.
윈도우의 경우 GUI를 사용하기위해 OS내에서 상당히 많은 과정을 거치지만, 리눅스는 그게 없잖아요.
도스랑 똑같이 직접 비디오 메모리를 건들수도 있습니다만, 자잘한 부분은 역시 '직접 만들어야' 합니다.
여러 OS 기반으로 만들기에 적절한 래퍼로는 OpenGL 이라는 API가 있는데, 이건 위의 자잘한 부분들을 잘 쓸 수 있게 프로그램 코드를 묶어놓은 것입니다.
오픈지엘이나 다이렉트나 하나만 공부하면 다른쪽은 비슷한 개념으로 금새 습득하므로, 그다지 상관은 없죠.
참고로, 엑박은 다이렉트, 플스, Wii 는 오픈지엘 기반으로 개발합니다. |+rp+|2893|+rp2+|2894|+rp3+|acoc_board_ideatip -
난_인간이다
2007.05.05 08:59
으흠...그렇군요.. 그러고 보니 윈도우가 그거땜시 다이렉트를 만든거였죠 -ㅅ-;;;
아.. 홈피에서...근데 군대가신다구요?? 잘 다녀 오시길 '-'|+rp2+|2900|+rp3+|acoc_board_ideatip -
Zeprod
2007.05.15 14:17
감사합니다... ' 'a |+rp+|2900|+rp2+|2920|+rp3+|acoc_board_ideatip -
힙합스타이너
2007.07.10 02:45
흠...스파라이트로 하면 3d 가속기를 못쓴다는 말이있던데....맞는다면 그냥 3d 형시긍로 2디 하는게 가장 좋을거일텐데..아니면 말구요-_-;;|+rp2+|2996|+rp3+|acoc_board_ideatip -
힙합스타이너
2007.07.10 02:49
참 글구 코드 길이나 등등으로 비슷한데..특별히 간단하거나 하는건 없는데..|+rp2+|2998|+rp3+|acoc_board_ideatip