달력

11

« 2018/11 »

  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  

'DirectX'에 해당되는 글 5

  1. 2010.12.08 WrapUp!
  2. 2010.12.06 MapTool - 완성본
  3. 2010.06.14 DirectX - 행렬(Matrices)
  4. 2010.05.19 DirectX-전체 화면 하는 방법
  5. 2010.05.17 DirectX-디바이스 생성
2010.12.08 00:51

WrapUp! 게임이야기/제작2010.12.08 00:51








예전에 인디 게임 공모전에 출품했던 작품
( 기획 : 박경훈 
  그래픽 : 전지환
  서버 : 손동진
  클라이언트 : 강민수 )

비록 문제도 많고 탈도 많았지만, 나름 뿌듯했던 작업이였죠.

징징

'게임이야기 > 제작' 카테고리의 다른 글

KGCA 19기 졸업 프로젝트 -팀 : Pathfinder, 터치다운(함정을 달리다)-  (0) 2011.02.01
MapTool - Ver 1.0  (0) 2011.01.24
WrapUp!  (0) 2010.12.08
MapTool - 완성본  (0) 2010.12.06
API-Catch Me If You Can  (0) 2010.06.10
Chtch Me If You Can Ver 2.1  (0) 2010.05.08
Posted by 안식의후크
2010.12.06 15:44

MapTool - 완성본 게임이야기/제작2010.12.06 15:44






이래저래 한바탕 폭풍이 지나가고,

이제는 다시 블로그질을 시작합니다.

아이콘 작업은 권수영(Nick_수바리)님께서 해주셨습니다.

ps : 초심으로 대동단결.

'게임이야기 > 제작' 카테고리의 다른 글

MapTool - Ver 1.0  (0) 2011.01.24
WrapUp!  (0) 2010.12.08
MapTool - 완성본  (0) 2010.12.06
API-Catch Me If You Can  (0) 2010.06.10
Chtch Me If You Can Ver 2.1  (0) 2010.05.08
Chtch Me If You Can Ver 1.0  (0) 2010.05.05
Posted by 안식의후크
2010.06.14 11:38

DirectX - 행렬(Matrices) 프로그래밍/DirectX2010.06.14 11:38





Dx에서 3차원의 정점(Vertex)를 화면상의 모니터로 출력해 주기 위해서는

3가지의 행렬 변환이 필요 하다.

1. 월드 행렬
2. 뷰 행렬
3. 투영 행렬

월드 행렬의 경우에는 3D오브젝트의 로컬좌표를 3차원의 필드에 특정 위치에 뿌려 주기 위해서,
( 좀더 간단하게 말하면, 로컬 좌표를 월드 좌표로 변환 하는 작업 )

뷰 행렬은 카메라를 셋팅한다고 생각하면 되는데,
뷰 행렬을 만들기 위해서는 추가적인 3개의 백터가 필요 하다.
카메라의 위치, 카메라가 바라보는 방향, 카메라의 Up벡터가 필요 하다.

마지막으로 투영 행렬은,
각각의 3D좌표들을 우리의 눈으로 보게 되는 2D로 변경하는 작업을 한다.

이런 작업을 렌더링 파이프라인이라고 하는데,

3D의 좌표를 모니터 화면에 뿌려주기 위한 작업이라고 보면 된다.


이제 이 작업을 Render할때 마다 해주어야 한다.
D3DInit나 InitVB와는 다르게,

행렬에 관한 연산은 매번 처리를 해 주어야 한다.

전체 소스는 생략,

Posted by 안식의후크





디바이스를 생성할때 InitD3D함수에서.


다음과 같은 부분이 있었습니다.
전 그냥 Windowed 라는 부분을 FALSE로 해주면
전체화면이 되겠거니, 하였으나,
그렇지 않더군요.

단순히 전체화면을 하고 싶을 뿐인데, 생각보다 해야하는 작업이 많았습니다.
(그렇다고 어렵진 않았습니다.)

일단 Windowed 속성을 FALSE로 주어야 하는건 맞지만 저것만 가지고는 부족하다는 겁니다.

요점만 먼저 말하자면,
D3DPRESENT_PARAMETERS 구조체에 몇가지 정도를 더 지정해 주어야 하며,
WinMain 함수에서 CreateWindow 또한 약간 손보아야 합니다.

먼저 예제의 실행 화면입니다.

자 그럼 이제 이 화면을 전체화면으로 바꾸어 봅시다.

먼저 CreateWindow 함수를 다음처럼 변경합니다.

어느 부분이 바뀌었는지는 다들 감을 잡으셨을 겁니다. WS_EX_TOPMOST | WS_POPUP 이부분입니다.
당연히 시작 위치는 0, 0
사이즈는 800 x 600 으로 잡아 주었네요.
이렇게만 하고 실행을 해보면 실행에는 문제가 없습니다.

여전히 파란 화면 뿐이지만, 테두리같은것이 다 사라지고 단순히 퍼런 창만 보입니다.

하지만 아직 전체화면은 되지 않았습니다.

자 일단 윈도우에 테두리를 지우고 어느정도 사이즈를 잡아 주었으니,
다음으로 해야 할 일은, 현재 해상도를 저 크기에 맞게 조절해야 한다는 것인데.
InitD3D 함수로 이동해서
D3DPRESENT_PARAMETERS 구조체의 설정을 할 때 다음처럼 변경해 봅시다.

간략하게 설명을 드리자면, 바뀐 부분은 Windowed 의 값이 TRUE에서 FALSE로 바뀌었습니다.(당연한 이치)

BackBufferFormat 에 값이 D3DFMT_X8R8G8B8로 변경되었습니다.
D3DFMT_UNKNOWN의 속성을 그대로 두면 되지 않는다고 합니다.
저 부분은 현재 윈도우에 대해서 32비트인지 16비트인지 하는 옵션을 조정하는 부분입니다만,
잘 모르시겠으면 그냥 저대로 하셔도 큰 문제는 없을 것 같네요. 그리고 SwapEffect는 변경되지 않았고,
hDeviceWindow, BackBufferWidth, BackBufferHeight에 대해서 추가되었습니다.

hDeviceWindow 에 대해서는 현재 윈도우 핸들을 넘겨주면 되고,


BackBufferWidth, BackBufferHeight는 딱 보면 아시겠지만 모니터의 해상도를 변경하는 부분으로 예상됩니다.

다음 처럼 코드를 변경하신 후 실행하면 해상도가 변경되는 느낌(?)이 들면서 전체화면으로 보여지는 파란 화면이 보이실 겁니다.

혹시 전체화면에 대해서 어떻게 하시는지 궁금해 하실 분이 있을 것 같아 미리 찾아보았습니다.
Posted by 안식의후크
2010.05.17 03:44

DirectX-디바이스 생성 프로그래밍/DirectX2010.05.17 03:44






자 이제 DX를 해봅시다!
일단 닥치고 코드를 칩니다.

실행하면 파란 화면이 나옵니다!
끝!!!!!!!!!!!!!

이라고 말하고 싶지만, 한번 천천히 살펴 봅시다;

API에 WindowEx를 만드는 소스를 참고하시면 이해가 편합니다.

일단 순서를 살펴봅시다. 140줄이나 되지만 고작 파란 화면만 뜨더니 끝나는,

기본적인 API의 메시지큐 구조를 파악했다는 전제로 저희가 알아야할 부분은
InitD3D 함수와,
Rander, Cleanup 함수 입니다.
변수로는 전역에 선언된
LPDIRECT3D9
LPDIRECT3DDEVICE9
에 대해서 어느정도 파악을 해보도록 합시다.

프로그램을 실행하면
최초 INT WINAPI WinMain 함수에 들어가게 됩니다.
기존 API처럼 WndClass를 등록하고 화면에 띄우는작업은 거의 비슷하지만,
메시지 루프에 들어가기전 InitD3D라는 함수 들르는것이 보입니다.

모든 내용을 다 알필요는 없다고 생각됩니다. 적당히 그런가? 정도로 파악하고 넘어갑시다.
언젠간 확실히 알게 될....꺼라 생각합니다.
코드 설명은 주석에 어느정도 달려 있으니 그냥 그런가 하고 넘어간다고 치고.
InitD3D에서 하는 일은,
D3D객체를 만들고,
디바이스에 대한 설정을 한 이후에,
그 설정값을 가지고, 디바이스를 생성!
하는 것 같습니다.
아마 모든 작업이 무사히 완료 됐다면 이제 메시지 루프에 들어가게 되겠지요.

메시지 루프에 들어가보니 WM_PAINT에서
Render 함수를 호출하네요,
바로 밑에는 ValidateRect를 해주는것을 보아하니,
지속적으로 WM_PAINT를 돌려 주는것 같습니다.
Render함수에서 이제 무언가 그려줘야 겠지만
이번 예제는 아무것도 그려주지 않습니다.
Render함수에서 하는 일은,
일단 g_pd3dDevice 의 변수가 아직 유효한가에 대해서 검사하는것 같습니다.
혹시라도 디바이스가 지워지지(NULL값이)않았는가 하는 예외처리를 해주고 있네요.
후면 버퍼를 퍼렇게 물들이고,
BeginScene과 EndScene 사이에 무언가를 렌더링 한 후에,
Present를 사용해서 후면 버퍼에 있는 디바이스를 보여주도록 이루어져 있습니다.
프로그램이 실행되는 동안에는 무한의 Rander함수 호출과,
이벤트에 따른 동작들이 이루어 지는것 같습니다.
이제 프로그램을 종료 하게 되면,
WM_DESTORY로 메시지가 들어가게 될테고

PostQuitMessage를 하기전에 Cleanup 함수를 호출합니다.


Cleanup 함수에 가보니, 전역으로 잡아 주었던 D3D객체와 디바이스를 NULL값으로 주고 있네요.
그 후 릴리즈를 사용해서 완벽하게 지워줍니다.

어차피 당장 무언가 거대한걸 바라는것도 아니니,
일단 이정도로만 개념을 잡아두면 당분간은 무리가 없을 것 같습니다.
Posted by 안식의후크