D3D Init
2022. 8. 5. 22:14ㆍPublic/GraphicsAPI
먼저 d3dUtility.h를 포함시키고, 장치를 위한 전역 변수를 인스턴스화
#include "d3dUtility.h"
IDirect3DDevice9* Device = 0;
해당 예제에서는 자원을 할당할 필요가 없으므로 Setup과 Cleanup 메서드는 비어뒀다.
//*******************공통***********************
bool Setup() { return true; } //자원의 할당이나 장치 특성의 확인, 애플리케이션 상태의 설정 등과 같이 예제를 실행하기 위한 사전 준비 작업이 이 함수에서 수행된다.
void Cleanup() { } //Setup 함수에서 할당된 자원을 해제하는 작업을 수행한다.
//이 함수는 모든 드로잉 코드를 구현하며, 물체의 위치를 수정하는 등의 매 프레임마다 일어나야 하는 작업을 수행한다.
//timeDelta 인자는 각 프레임의 경과시간이며, 초당 프레임과의 애니메이션 동기화에 이용된다.
bool Display(float timeDelta)
{
if (Device)
{
Device->Clear(
0, //pRects 배열 내 사각형의 수
0, //소거하려는 화면 사각형의 배열
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, //어떤 표면을 소거할지 지정
0x00000080, //랜더 대상을 소거할 색상
1.0f, //깊이 버퍼를 지정하고자 하는 값
0 //스텐실 버퍼를 지정하고자 하는 값
);
Device->Present(0, 0, 0, 0); //후면 버퍼와 프론트 버퍼 스왑
}
return true;
}
Display 메서드는 후면 버퍼를 소가혹 깊이/스텐실 버퍼를 각각 검은색과 1.0으로 초기화하는 IDirect3DDevice9::Clear 메서드를 호출한다. 애플리케이션이 중지 상태가 아닌 경우에만 드로잉을 수행하였음을 확인하자. IDirect3DDevice9::Clear
선언은 다음과 같다.
HRESULT IDirect3DDevice9::Clear(
DWORD Couont,
const D3DRECT* pRects,
DWORD Flags,
D3DCOLOR Color,
float Z,
DWORD Stencil
);
- Count - pRects 배열 내 사각형의 수
- pRects - 소거하려는 화면 사각형의 배열, 표면의 특정 영역만을 소거할 수 있도록 해준다.
- Flags - 어떤 표면을 소거할지를 지정한다. 다음과 같은 표면들을 소거할 수 있다.
-> D3DCLEAR_TARGET - 렌더 대상 표면, 보통은 후면 버퍼이다.
-> D3DCLEAR_ZBUFFER - 깊이 버퍼
-> D3DCLEAR_STENCIL - 스텐실 버퍼 - Color - 렌더 대상을 소거할 색상
- Z - 깊이 버퍼(z-버퍼)에 지정하고자 하는 값
- Stencil - 스텐실 버퍼에 지정하고자 하는
표면을 소거한 다음에 Present 메서드를 호출하여 후면 버퍼를 시연하였다.
윈도우 프로시저 메서드는 몇 가지의 이벤트를 처리한다.
현재 코드에서는 ESC 키를 눌러 애플리케이션을 종료할 수 있도록 해준다.
LRESULT CALLBACK d3d::WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch (iMessage)
{
case WM_DESTROY:
::PostQuitMessage(0);
break;
case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
::DestroyWindow(hWnd);
break;
}
return ::DefWindowProc(hWnd, iMessage, wParam, lParam);
}
WinMain은 다음과 같은 단계를 수행한다.
- 메인 디스플레이 윈도우와 Direct3D를 초기화한다.
- Setup 함수를 호출하여 애플리케이션 사전 준비를 수행한다.
- Display를 디스플레이 함수로 이용하여 메시지 루프에 진입한다.
- 애플리케이션을 정리하고 최종적으로 IDirect3DDevice9 객체를 해제한다.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nCmdShow)
{
//메인 디스플레이 윈도우와 Direct3D초기화
if (!d3d::InitD3D(hInstance, 800, 600, true, D3DDEVTYPE_HAL, &Device))
{
::MessageBox(NULL, TEXT("InitD3D()-FAILED"), NULL, MB_OK);
return 0;
}
//Setup함수 호출
if (!Setup())
{
::MessageBox(NULL, TEXT("Setup()-FAILED"), NULL, MB_OK);
return 0;
}
//Display를 디스플레이 함수로 이용하여 메시지 루프에 진입
d3d::EnterMsgLoop(Display);
//애플리케이션 정리 & 삭제
Cleanup();
Device->Release();
return 0;
}
- Direct3D는 프로그래머와 그래픽 하드웨어를 연결하는 하나의 매개자로 생각할 수 있다. 프로그래머는 Direct3D 함수를 호출하며, 물리적 하드웨어는 장치의 HAL(하드웨어 추상 레이어)과의 인터페이싱을 통해 프로그래머가 요청한 작업을 수행한다.
- REF 장치는 개발자의 장치에서 지원하지 않는 기능을 이용하는 Direct3D 애플리케이션을 테스트할 수 있도록 해준다.
- 컴포넌트 객체 모델(COM)은 DirectX를 프로그래밍 언어에 독립적이고 하위 호환성을 가질 수 있도록 해주는 기술이다. Direct3D 프로그래머는 COM의 세부적인 부분이나 작동 원리에 대해 알 필요는 없으며, COM 인터페이스를 얻고 해제하는 방법만을 기억하면 된다.
- 표면은 2D 이미지를 보관하는 데 이용되는 특별한 Direct3D 인터페이스로, D3DFORMAT 열거형의 멤버를 이용해 표면의 픽셀 포맷을 지정한다. 그 밖의 Direct3D의 자원들은 D3DPOOL 열거형의 멤버로 지정하는 여러 가지 다른 메모리 풀에 보관될 수 있으며, 부가적으로 표면에 멀티 샘플링 처리를 적용하여 좀더 부드러운 이미지를 만들어낼 수 있다.
- IDirect3D9 인터페이스를 이용하면 시스템의 그래픽 장치에 대한 정보를 얻을 수 있다. 예를 들어, 이 인터페이스를 통해 장치 특성에 대한 정보를 얻고 IDirect3DDevice9 인터페이스를 만드는 데 이 정보를 이용할 수 있다.
- IDirect3DDevice9 인터페이스는 그래픽 장치를 제어하기 위한 소프트웨어 인터페이스이다. 예를 들어, IDirect3DDevice9::Clear 메서드를 호출하면 간접적으로 그래픽 장치의 지정된 표면을 소거한다.
'Public > GraphicsAPI' 카테고리의 다른 글
정점 버퍼 (0) | 2022.08.14 |
---|---|
FVF (0) | 2022.08.14 |
일반적인 WIN32 구조와 D3D 비교 (0) | 2022.08.10 |
삼각형 (0) | 2022.08.06 |
모델표현 / 버텍스 포맷 (0) | 2022.08.06 |