760 likes | 1.39k Views
게임 프로그래밍 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 윈도우 응용프로그램과 비디오 카드와의 통신을 가능하게 하는 인터페이스와 함수들의 집합
E N D
게임 프로그래밍 I 제 9, 10 주 Direct3D 기본개념
Direct3D Architecture Win32 Application Direct3D API GDI Hal Device Device Driver Interface (DDI) Graphics Hardware Direct3D 기본개념
Direct3D • 3D 가속을 이용해 3D를 렌더링할 수 있게 해주는 low-leve의 그래픽 API • 윈도우 응용프로그램과 비디오 카드와의 통신을 가능하게 하는 인터페이스와 함수들의 집합 • 기본적인 2D 그래픽 함수 지원 • 모든 raster 그래픽은 프로그래머가 제작 • 하드웨어와의 통신을 위한 trasparent layer 제공 • 파일 입출력은 지원하지 않음 • D3DX –확장 기능 지원 • 수학, 애니메이션, 모델, 텍스쳐 등을 쉽게 구현 가능 Direct3D 기본개념
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 기본개념
Direct3D 개발환경 • Header File • d3d9.h • dxerr9.h • Library File • d3d9.lib • d3dx9.lib • DLL File • d3d9.dll Direct3D 기본개념
Direct3D Surface • 2D이미지를 surface로 표현 • IDirect3DSurface9 인터페이스 사용 • lock, unlock 기능 지원 • 이전 버전에 비해 member 함수의 수를 줄임 • Primary Surface, Back Surface, Offscreen Surface • 관련 구조체 • D3DSURFACE_DESC Direct3D 기본개념
IDirect3DSurface9 인터페이스 • GetContainer • 부모 텍스쳐의 포인터를 얻는다 • GetDesc • D3DSURFACE_DESC 구조체를 얻는다 • LockRect • surface를 lock • D3DLOCKED_RECT 구조체를 얻는다 • UnlockRect • lock된 surface를 해제 • GetDC • surface에 대한 device context를 얻는다 • ReleaseDC • device context에 대한 핸들을 윈도우에 돌려준다 Direct3D 기본개념
Surface 동작 • Blit기능은 지원하지 않음 • D3DX 라이브러리에서 Surface복사기능 지원 • D3DXLoadSurfaceFromSurface Direct3D 기본개념
D3DXLoadSurfaceFromSurface HRESULTWINAPID3DXLoadSurfaceFromSurface( LPDIRECT3DSURFACE9pDestSurface, CONST PALETTEENTRY*pDestPalette, CONST RECT*pDestRect, LPDIRECT3DSURFACE9pSrcSurface, CONST PALETTEENTRY*pSrcPalette, CONST RECT*pSrcRect, DWORDFilter, D3DCOLORColorKey ); Direct3D 기본개념
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 기본개념
D3DXLoadSurfaceFromSurface : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL • D3DXERR_INVALIDDATA Direct3D 기본개념
Surface 내용 수정 HRESULTIDirect3DSurface9::LockRect( D3DLOCKED_RECT*pLockedRect, const RECT*pRect, DWORDFlags ); Direct3D 기본개념
LockRect : 인자 • D3DLOCKED_RECT*pLockedRect • Lock된 Surace에 대한 정보 • const RECT*pRect • lock하고자 하는 크기의 사각형 좌표 • DWORDFlags • lock하는 방법에 관한 flag Direct3D 기본개념
LockRect : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL • D3DXERR_WASSTILLDRAWING Direct3D 기본개념
UnlockRect HRESULTIDirect3DSurface9::UnlockRect(); Direct3D 기본개념
UnlockRect : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL Direct3D 기본개념
Direct3D Surface 생성 HRESULTIDirect3DDevice9:: CreateOffscreenPlainSurface( UINTWidth, UINTHeight, D3DFORMATFormat, DWORDPool, IDirect3DSurface9**ppSurface, HANDLE*pSharedHandle ); Direct3D 기본개념
CreateOffscreenPlainSurface : 인자 • UINTWidth • Suface의 넓이 • UINTHeight • Surface의 높이 • D3DFORMATFormat • Surface의 형식 • DWORDPool • 사용할 surface pool의 형식 • IDirect3DSurface9**ppSurface • 생성되는 Surface의 포인터 • HANDLE*pSharedHandle • 예약, NULL로 지정 Direct3D 기본개념
CreateOffscreenPlainSurface : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL Direct3D 기본개념
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 기본개념
Direct3D 초기화 • Direct3D 객체 생성 • present 매개변수 설정 • Direct3D 장치 생성 Direct3D 기본개념
Direct3D 객체 생성 IDirect3D9*WINAPIDirect3DCreate9( UINTSDKVersion ); • UINTSDKVersion • 사용하고 있는 Direct3D 버전 • D3D_SDK_VERSION 사용 Direct3D 기본개념
Direct3DCreate9 : 예제 // Direct3D 객체 생성 LPDIRECT3D9 pD3D; pD3D = Direct3DCreate9(D3D_SDK_VERSION); Direct3D 기본개념
present 매개변수 설정 • present • back 버퍼의 내용을 primary surface로 이동하는 것을 의미 • back 버퍼 작업을 마친후에 primary surfce로 prsent • D3DPRESENT_PARAMETERS Direct3D 기본개념
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 기본개념
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 기본개념
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 기본개념
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 기본개념
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 기본개념
Direct3D 장치 생성 HRESULTIDirect3D9::CreateDevice( UINTAdapter, D3DDEVTYPEDeviceType, HWNDhFocusWindow, DWORDBehaviorFlags, D3DPRESENT_PARAMETERS*pPresentationParameters, IDirect3DDevice9**ppReturnedDeviceInterface ); Direct3D 기본개념
CreateDevice : 인자 • UINTAdapter • 사용하려는 그래픽 카드 • 기본 디스플레이는 0 • D3DDEVTYPEDeviceType • 생성하려는 장치 유형 지정 • 하드웨어가속장치 : D3DDEVTYPE_HAL • 소프트웨어장치 : D3DDEVTYPE_REF • HWNDhFocusWindow • 현재 윈도우 핸들 • DWORDBehaviorFlags • 장치 동작을 정의 • D3DPRESENT_PARAMETERS*pPresentationParameters • D3DPRESENT_PARAMETERS의 포인터 • IDirect3DDevice9**ppReturnedDeviceInterface • 결과를 돌려받을 포인터 Direct3D 기본개념
CreateDevice : 인자 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL • D3DERR_NOTAVAILABLE • D3DERR_OUTOFVIDEOMEMORY Direct3D 기본개념
CreateDevice : 예제 // 하드웨어가속을 사용하는 장치 생성 LPDIRECT3D9 pD3D; HRESULT hr; hr = pD3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, pDevice); Direct3D 기본개념
DirectDraw와의 비교 • Clipper 생성 필요없음 • 협력 수준 설정 필요없음 • 화면 해상도 설정 필요없음 • CreateDevice()가 모든 일을 함 Direct3D 기본개념
기본 Direct3D 구조체 • D3DCOLOR • D3DCOLORVALUE • D3DVECTOR • D3DMATRIX Direct3D 기본개념
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 기본개념
D3DCOLORVALUE • 부동 소수점 색상 값을 다룬다 typedefstruct _D3DCOLORVALUE{ floatr; floatg; floatb; floata; } D3DCOLORVALUE; Direct3D 기본개념
D3DVECTOR • 3D에서 한점을 정의 typedef struct _D3DVECTOR{ floatx, y, z; } D3DVECTOR; Direct3D 기본개념
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 기본개념
Vertex 버퍼 • DirectX 6.0부터 포함 • Vertex들로 채워진 버퍼 • Surface를 만드는 vertex data를 담는 버퍼 • lock, unlock • 정적 기하 도형들의 렌더링을 가속화 • data의 high-bandwidth stream제공 Direct3D 기본개념
Vertex 버퍼 생성 HRESULTCreateVertexBuffer( UINTLength, DWORDUsage, DWORDFVF, D3DPOOLPool, IDirect3DVertexBuffer9**ppVertexBuffer, HANDLE*pSharedHandle ); Direct3D 기본개념
CreateVertexBuffer : 인자 • UINTLength • 버퍼의 크기 • DWORDUsage • 버퍼의 이용을 지정하는 flag • 보통 D3DUSAGE_WRITEONLY • DWORDFVF • FVF(Flexible Vertex Format)을 사용하지 않을 경우 0 • D3DPOOLPool • vertex버퍼가 차지한 메모리 pool • IDirect3DVertexBuffer9**ppVertexBuffer • 생성되는 vertex 버퍼의 포인터 • HANDLE*pSharedHandle • 사용되지 않음, NULL로 지정 Direct3D 기본개념
CreateVertexBuffer : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL • D3DERR_OUTOFVIDEOMEMORY • E_OUTOFMEMORY Direct3D 기본개념
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 기본개념
Lock HRESULTIDirect3DVertexBuffer9::Lock( UINTOffsetToLock, UINTSizeToLock, VOID**ppbData, DWORDFlags ); Direct3D 기본개념
Lock : 인자 • UINTOffsetToLock • lock을 할 버퍼 내부의 offset • UINTSizeToLock • lock을 할 버퍼의 크기 • VOID**ppbData • lock을 할 버퍼정보를 포함하는 포인터 • DWORDFlags • lock을 할 때의 flag Direct3D 기본개념
Lock : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL Direct3D 기본개념
Unlock HRESULTIDirect3DVertexBuffer9::Unlock(VOID); Direct3D 기본개념
Unlock : 결과 • 성공 • D3D_OK • 에러 • D3DERR_INVALIDCALL Direct3D 기본개념
렌더링 • 장면을 초기화 • 렌더링 • 시작 • 렌더링 스트림에 부착 • FVF 설정 • 그리기 • 끝 • Present • 종료 Direct3D 기본개념