1 / 76

게임 프로그래밍 I

게임 프로그래밍 I. 제 9, 10 주 Direct3D 기본개념. Direct3D Architecture. Win32 Application. Direct3D API. GDI. Hal Device. Device Driver Interface (DDI). Graphics Hardware. Direct3D. 3D 가속을 이용해 3D 를 렌더링할 수 있게 해주는 low-leve 의 그래픽 API 윈도우 응용프로그램과 비디오 카드와의 통신을 가능하게 하는 인터페이스와 함수들의 집합

alyssa
Download Presentation

게임 프로그래밍 I

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 게임 프로그래밍 I 제 9, 10 주 Direct3D 기본개념

  2. Direct3D Architecture Win32 Application Direct3D API GDI Hal Device Device Driver Interface (DDI) Graphics Hardware Direct3D 기본개념

  3. Direct3D • 3D 가속을 이용해 3D를 렌더링할 수 있게 해주는 low-leve의 그래픽 API • 윈도우 응용프로그램과 비디오 카드와의 통신을 가능하게 하는 인터페이스와 함수들의 집합 • 기본적인 2D 그래픽 함수 지원 • 모든 raster 그래픽은 프로그래머가 제작 • 하드웨어와의 통신을 위한 trasparent layer 제공 • 파일 입출력은 지원하지 않음 • D3DX –확장 기능 지원 • 수학, 애니메이션, 모델, 텍스쳐 등을 쉽게 구현 가능 Direct3D 기본개념

  4. Direct3D (계속) • DirectX 2.0에서 처음 등장 • DirectX 7.0 • 하드웨어 가속 변환과 조명 지원 • immediate 모드와 retained 모드 중에서 immediate 모드에 집중 • DirectX 8.0 • Direct Graphics 라는 이름으로 DirectDraw와 통합 • DirectDraw를 이용하지 않고 Direct3D만으로 초기화 • shader 지원 • DirectX 9.0 • shader의 강화 – high-level shader 언어 Direct3D 기본개념

  5. Direct3D 개발환경 • Header File • d3d9.h • dxerr9.h • Library File • d3d9.lib • d3dx9.lib • DLL File • d3d9.dll Direct3D 기본개념

  6. Direct3D Surface • 2D이미지를 surface로 표현 • IDirect3DSurface9 인터페이스 사용 • lock, unlock 기능 지원 • 이전 버전에 비해 member 함수의 수를 줄임 • Primary Surface, Back Surface, Offscreen Surface • 관련 구조체 • D3DSURFACE_DESC Direct3D 기본개념

  7. IDirect3DSurface9 인터페이스 • GetContainer • 부모 텍스쳐의 포인터를 얻는다 • GetDesc • D3DSURFACE_DESC 구조체를 얻는다 • LockRect • surface를 lock • D3DLOCKED_RECT 구조체를 얻는다 • UnlockRect • lock된 surface를 해제 • GetDC • surface에 대한 device context를 얻는다 • ReleaseDC • device context에 대한 핸들을 윈도우에 돌려준다 Direct3D 기본개념

  8. Surface 동작 • Blit기능은 지원하지 않음 • D3DX 라이브러리에서 Surface복사기능 지원 • D3DXLoadSurfaceFromSurface Direct3D 기본개념

  9. D3DXLoadSurfaceFromSurface HRESULTWINAPID3DXLoadSurfaceFromSurface( LPDIRECT3DSURFACE9pDestSurface, CONST PALETTEENTRY*pDestPalette, CONST RECT*pDestRect, LPDIRECT3DSURFACE9pSrcSurface, CONST PALETTEENTRY*pSrcPalette, CONST RECT*pSrcRect, DWORDFilter, D3DCOLORColorKey ); Direct3D 기본개념

  10. D3DXLoadSurfaceFromSurface : 인자 • LPDIRECT3DSURFACE9pDestSurface • 대상 Surace의 포인터 • CONST PALETTEENTRY*pDestPalette • 대상 Surface의 팔레트 포인터, 대부분 NULL • CONST RECT*pDestRect • 대상 Surface내의 사각형 좌표 • LPDIRECT3DSURFACE9pSrcSurface • 원본 Surface의 포인터 • CONST PALETTEENTRY*pSrcPalette • 원본 Surace의 팔레트 포인터, 대부분 NULL • CONST RECT*pSrcRect • 원본 Surface내의 사각형 좌표 • DWORDFilter • 윈본과 대상이 일치하지 않는 경우 이미지 복사 복사 방식 • D3DCOLORColorKey • Colorkey Direct3D 기본개념

  11. D3DXLoadSurfaceFromSurface : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL • D3DXERR_INVALIDDATA Direct3D 기본개념

  12. Surface 내용 수정 HRESULTIDirect3DSurface9::LockRect( D3DLOCKED_RECT*pLockedRect, const RECT*pRect, DWORDFlags ); Direct3D 기본개념

  13. LockRect : 인자 • D3DLOCKED_RECT*pLockedRect • Lock된 Surace에 대한 정보 • const RECT*pRect • lock하고자 하는 크기의 사각형 좌표 • DWORDFlags • lock하는 방법에 관한 flag Direct3D 기본개념

  14. LockRect : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL • D3DXERR_WASSTILLDRAWING Direct3D 기본개념

  15. UnlockRect HRESULTIDirect3DSurface9::UnlockRect(); Direct3D 기본개념

  16. UnlockRect : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL Direct3D 기본개념

  17. Direct3D Surface 생성 HRESULTIDirect3DDevice9:: CreateOffscreenPlainSurface( UINTWidth, UINTHeight, D3DFORMATFormat, DWORDPool, IDirect3DSurface9**ppSurface, HANDLE*pSharedHandle ); Direct3D 기본개념

  18. CreateOffscreenPlainSurface : 인자 • UINTWidth • Suface의 넓이 • UINTHeight • Surface의 높이 • D3DFORMATFormat • Surface의 형식 • DWORDPool • 사용할 surface pool의 형식 • IDirect3DSurface9**ppSurface • 생성되는 Surface의 포인터 • HANDLE*pSharedHandle • 예약, NULL로 지정 Direct3D 기본개념

  19. CreateOffscreenPlainSurface : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL Direct3D 기본개념

  20. CreateOffscreenPlainSurface : 예제 // 새로운 이미지 surface 생성 HRESULT hr; LPDIRECT3DDEVICE9 pDevice; LPDIRECT3DSURFACE9 pSurface = 0; hr = pDevice->CreateOffscreenPlainSurface( 640, 480, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pSurface, NULL); // 실행… // surface 해제 pSurface->Release(); pSurface = 0; Direct3D 기본개념

  21. Direct3D 초기화 • Direct3D 객체 생성 • present 매개변수 설정 • Direct3D 장치 생성 Direct3D 기본개념

  22. Direct3D 객체 생성 IDirect3D9*WINAPIDirect3DCreate9( UINTSDKVersion ); • UINTSDKVersion • 사용하고 있는 Direct3D 버전 • D3D_SDK_VERSION 사용 Direct3D 기본개념

  23. Direct3DCreate9 : 예제 // Direct3D 객체 생성 LPDIRECT3D9 pD3D; pD3D = Direct3DCreate9(D3D_SDK_VERSION); Direct3D 기본개념

  24. present 매개변수 설정 • present • back 버퍼의 내용을 primary surface로 이동하는 것을 의미 • back 버퍼 작업을 마친후에 primary surfce로 prsent • D3DPRESENT_PARAMETERS Direct3D 기본개념

  25. D3DPRESENT_PARAMETERS typedef struct _D3DPRESENT_PARAMETERS_{ UINTBackBufferWidth, BackBufferHeight; D3DFORMATBackBufferFormat; UINTBackBufferCount; D3DMULTISAMPLE_TYPEMultiSampleType; DWORDMultiSampleQuality; D3DSWAPEFFECTSwapEffect; HWNDhDeviceWindow; BOOLWindowed; BOOLEnableAutoDepthStencil; D3DFORMATAutoDepthStencilFormat; DWORDFlags; UINTFullScreen_RefreshRateInHz; UINTPresentationInterval; } D3DPRESENT_PARAMETERS; Direct3D 기본개념

  26. D3DPRESENT_PARAMETERS : 변수 • UINTBackBufferWidth, BackBufferHeight • back 버퍼 넓이, 높이 • D3DFORMATBackBufferFormat • back 버퍼 형식 지정 • 32비트 : D3DFMT_A8R8G8B8 • 16비트 : D3DFMT_R5G6R5 • UINTBackBufferCount • primary surface와 연결되는 back 버퍼 수 • D3DMULTISAMPLE_TYPEMultiSampleType • 멀티샘플링의 유형 지정 • D3DMULTISAMPLE_NONE으로 설정 • DWORDMultiSampleQuality • 0과 IDirect3D9::CheckDeviceMultiSampleType의 결과 사이의 값 • D3DSWAPEFFECTSwapEffect • back 버퍼를 primary surface에 present하는 방식 • 일반적으로 D3DSWAPEFFECT_COPY Direct3D 기본개념

  27. D3DPRESENT_PARAMETERS : 변수 • HWNDhDeviceWindow • 렌더링 대상으로 사용하는 윈도우의 핸들 • BOOLWindowed • 전체화면과 윈도우 모드 선택 • BOOLEnableAutoDepthStencil • 깊이 버퍼나 스텐실 버퍼를 관리할지 결정 • 일반적으로 TRUE • D3DFORMATAutoDepthStencilFormat • 갚이 버퍼 형식 지정 • 일반적으로 D3DFMT_16 사용 • DWORDFlags • D3DPRESENTFLAG_LOCKABLEBACKBUFFER만 사용 가능 • 성능 개선을 위해 0 사용 • UINTFullScreen_RefreshRateInHz • refresh 속도 • 최적속도 : D3DPRESENT_RATE_DEFAULT • UINTPresentationInterval • present 단계 설정 • 빠른 처리 : D3DPRESENT_INTERVAL_IMMEDIATE Direct3D 기본개념

  28. D3DPRESENT_PARAMETERS : 예제 // 전체화면, width x height, bpp비트 생성 구조체 D3DPRESENT_PARAMETERS d3dpp; zeromemory(&d3dpp, sizeof(d3dpp)); // back버퍼의 넓이와 높이 d3dpp.BackBufferWidth = width; d3dpp.BackBufferHeight = height; // 깊이 if (bpp == 16) d3dpp.BackBufferFormat = D3DFMT_R5G6B5; else if (bpp == 24) d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; else if (bpp == 32) d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; // primary 버퍼와와 연결할 back버퍼는 1개 d3dpp.BackBufferCount = 1; // 멀티샘플링 없음 d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; // 멀티샘플링 수준 d3dpp.MultiSampleQuality = 0; Direct3D 기본개념

  29. D3DPRESENT_PARAMETERS : 예제 // back버퍼를 primary surface로 복사 d3dpp.SwapEffect = D3DSWAPEFFECT_COPY; // 랜더링해 넣을 윈도우 핸들 d3dpp.hDeviceWindow = hWnd; // 전체화면 d3dpp.Windowed = FALSE; //깊이버퍼 관리 d3dpp.EnableAutoDepthStencil = TRUE; //깊이버퍼의 깊이를 16비트로 설정 d3dpp.AutoDepthStencilFormat = F3DFMT_D16; //기본 refresh rate 사용 d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; //가능한 빠른화면 업데이트 d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //back버퍼의 lock 허용 d2dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER Direct3D 기본개념

  30. Direct3D 장치 생성 HRESULTIDirect3D9::CreateDevice( UINTAdapter, D3DDEVTYPEDeviceType, HWNDhFocusWindow, DWORDBehaviorFlags, D3DPRESENT_PARAMETERS*pPresentationParameters, IDirect3DDevice9**ppReturnedDeviceInterface ); Direct3D 기본개념

  31. CreateDevice : 인자 • UINTAdapter • 사용하려는 그래픽 카드 • 기본 디스플레이는 0 • D3DDEVTYPEDeviceType • 생성하려는 장치 유형 지정 • 하드웨어가속장치 : D3DDEVTYPE_HAL • 소프트웨어장치 : D3DDEVTYPE_REF • HWNDhFocusWindow • 현재 윈도우 핸들 • DWORDBehaviorFlags • 장치 동작을 정의 • D3DPRESENT_PARAMETERS*pPresentationParameters • D3DPRESENT_PARAMETERS의 포인터 • IDirect3DDevice9**ppReturnedDeviceInterface • 결과를 돌려받을 포인터 Direct3D 기본개념

  32. CreateDevice : 인자 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL • D3DERR_NOTAVAILABLE • D3DERR_OUTOFVIDEOMEMORY Direct3D 기본개념

  33. CreateDevice : 예제 // 하드웨어가속을 사용하는 장치 생성 LPDIRECT3D9 pD3D; HRESULT hr; hr = pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, pDevice); Direct3D 기본개념

  34. DirectDraw와의 비교 • Clipper 생성 필요없음 • 협력 수준 설정 필요없음 • 화면 해상도 설정 필요없음 • CreateDevice()가 모든 일을 함 Direct3D 기본개념

  35. 기본 Direct3D 구조체 • D3DCOLOR • D3DCOLORVALUE • D3DVECTOR • D3DMATRIX Direct3D 기본개념

  36. D3DCOLOR • typedef DWORD D3DCOLOR; • D3DCOLOR 변환 매크로 // r, g, b 쌍을 DWORD로 변환 D3DCOLOR_XRGB(r, g, b) \ ((D3DCOLOR)(((&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8) |((b)&0xff))) // r, g, b, a 쌍을 DWORD로 변환 D3DCOLOR_ARGB(r, g, b) \ ((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8) |((b)&0xff))) Direct3D 기본개념

  37. D3DCOLORVALUE • 부동 소수점 색상 값을 다룬다 typedefstruct _D3DCOLORVALUE{ floatr; floatg; floatb; floata; } D3DCOLORVALUE; Direct3D 기본개념

  38. D3DVECTOR • 3D에서 한점을 정의 typedef struct _D3DVECTOR{ floatx, y, z; } D3DVECTOR; Direct3D 기본개념

  39. D3DMATRIX • 4x4행렬 정의 typedef struct _D3DMATRIX { union { struct { float_11, _12, _13, _14; float_21, _22, _23, _24; float _31, _32, _33, _34; float_41, _42, _43, _44; }; floatm[4][4]; }; } D3DMATRIX; Direct3D 기본개념

  40. Vertex 버퍼 • DirectX 6.0부터 포함 • Vertex들로 채워진 버퍼 • Surface를 만드는 vertex data를 담는 버퍼 • lock, unlock • 정적 기하 도형들의 렌더링을 가속화 • data의 high-bandwidth stream제공 Direct3D 기본개념

  41. Vertex 버퍼 생성 HRESULTCreateVertexBuffer( UINTLength, DWORDUsage, DWORDFVF, D3DPOOLPool, IDirect3DVertexBuffer9**ppVertexBuffer, HANDLE*pSharedHandle ); Direct3D 기본개념

  42. CreateVertexBuffer : 인자 • UINTLength • 버퍼의 크기 • DWORDUsage • 버퍼의 이용을 지정하는 flag • 보통 D3DUSAGE_WRITEONLY • DWORDFVF • FVF(Flexible Vertex Format)을 사용하지 않을 경우 0 • D3DPOOLPool • vertex버퍼가 차지한 메모리 pool • IDirect3DVertexBuffer9**ppVertexBuffer • 생성되는 vertex 버퍼의 포인터 • HANDLE*pSharedHandle • 사용되지 않음, NULL로 지정 Direct3D 기본개념

  43. CreateVertexBuffer : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL • D3DERR_OUTOFVIDEOMEMORY • E_OUTOFMEMORY Direct3D 기본개념

  44. CreateVertexBuffer : 예제 LPDIRECT3DVERTEXBUFFER9 pVB; CUSTOMVERTEX vertices[] = { { 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, }; pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pVB ) Direct3D 기본개념

  45. Lock HRESULTIDirect3DVertexBuffer9::Lock( UINTOffsetToLock, UINTSizeToLock, VOID**ppbData, DWORDFlags ); Direct3D 기본개념

  46. Lock : 인자 • UINTOffsetToLock • lock을 할 버퍼 내부의 offset • UINTSizeToLock • lock을 할 버퍼의 크기 • VOID**ppbData • lock을 할 버퍼정보를 포함하는 포인터 • DWORDFlags • lock을 할 때의 flag Direct3D 기본개념

  47. Lock : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL Direct3D 기본개념

  48. Unlock HRESULTIDirect3DVertexBuffer9::Unlock(VOID); Direct3D 기본개념

  49. Unlock : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL Direct3D 기본개념

  50. 렌더링 • 장면을 초기화 • 렌더링 • 시작 • 렌더링 스트림에 부착 • FVF 설정 • 그리기 • 끝 • Present • 종료 Direct3D 기본개념

More Related