LPDIRECT3D9 m_pSDK; 

-> 사용자가 사용하고자 하는 장치를 조사하고 해당 장치를 제어하기 위한 객체의 할당을 담당하는 com 객체


LPDIRECT3DDEVICE9 m_pDevice;

-> 실질적으로 장치를 제어하는 com 객체. 

 

LPD3DXSPRITE m_pSprite;

 

com 객체란? 

component Object Model 의 약자로 우리가 배우는 다이렉트X에서 제공하는 부품단위의 객체들을 뜻한다. 

개발환경에 상관없이 호환이 가능한 컴포넌트들의 사용을 위해

마이크로 소프트 사가 규정한 표준화된 방법이 바로 com 객체이다. 

 
1. 장치를 제어하기 위한 컴객체를 생성을 먼저 하고. 
2. 이 제어하기 위한 SDK를 이용하여 그래픽카드의 지원 수준을 조사하고. 
3. 그래픽 카드의 지원 수준에 맞춰 장치를 제어하기 위한 컴객체를 생성한다.

 

초기화 부분 함수

D3DCAPS9 DeviceCap; 
ZeroMemory(&DeviceCap, sizeof(D3DCAPS9)); 
m_pSDK = Direct3DCreate9(D3D_SDK_VERSION); 

if (FAILED(m_pSDK->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &DeviceCap)))
{
	AfxMessageBox(L"Create SDK Failed"); 
	return E_FAIL; 
}
DWORD vp = 0;

if (DeviceCap.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
	vp |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
    vp |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;

 

D3DCAPS9 DeviceCap 

-> 장치의 지원 수준을 조사해서 데이터를 보관할 구조체.

 

VERTEXPROCESSING

-> 정점 변환 + 조명연산을 합쳐 버텍스 프로세싱이라 부름. 

조명연산과 정점 변환을 하드웨어(장치에서)에서 처리할 것인지,

아니면 개발자가 소프트웨어에서 처리할 것인지를 뜻한다. 

 

 

D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS)); 

d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;

d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = g_hWND;
d3dpp.Windowed = TRUE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
	
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;


if (FAILED(m_pSDK->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWND, vp, &d3dpp, &m_pDevice)))
{
	ERR_MSG(L"Device Creating Failed");
	return E_FAIL; 
}
return S_OK;

 

BackBufferWidth 

-> 백 버퍼 너비

 

BackBufferHeight 

-> 백 버퍼 높이

 

BackBufferFormat 

-> 백 버퍼 형식

-> 현재 창을 어떤형식으로 렌더링 할 것인지.

-> A8R8G8B8은 알파값 8비트, 빨강 8비트, 파랑 8비트, 초록 8비트를 사용한다는 의미.

 

BackBufferCount = 1;

-> 여기서 1은 총 2개의 백버퍼를 사용하겠다. 즉 디폴트로 한개 생김. 거기에 +1 이 되는 것이다.

 

MultiSampleType = D3DMULTISAMPLE_NONE;

-> D3DMULTISAMPLE_TYPE 열거 형의 멤버

-> SwapEffect가 D3DSWAPEFFECT_DISCARD로 설정되지 않은 경우 값은 NONE이어야 한다.

 

MultiSampleQuality

-> 품질 수준.

-> 범위는 CheckDeviceMultiSampleType에서 사용하는 pQualityLevels에서 반환 한 수준보다 0에서 1 사이 이다.

-> 더 큰 값을 전달하면 D3DERR_INVALIDCALL 오류가 반환된다.

-> 렌더링 대상 또는 깊이 스텐실 표면과 샘플 타입의 쌍 값이 일치해야한다.

 

SwapEffect = D3DSWAPEFFECT_DISCARD;

-> 스왑 체인 방식을 사용하겠다는 의미.

-> 더블버퍼링의 상위 호환 버전.

 

GPU는 비디오 메모리에 존재하는 프레임 버퍼에 계속해서 이미지를 지우고 그리는 과정을 반복한다.

 

그리고 비디오 컨트롤러는 이 프레임 버퍼를 참조해서 스크린에 이미지를 출력하게 되는데,

이 속도가 GPU가 프레임 버퍼에 이미지를 그리는 속도보다 훨씬 빠르다.

 

때문에 프레임 버퍼가 갱신되는 과정이 스크린에 모두 그려지게 되면서,

이미지 전체가 사라졌다 다시 그려지는 것처럼 깜빡거리는 현상이 생길 수 있다.

 

이런 현상을 방지하기 위해 더블 버퍼링 형식을 사용해왔지만,

전면 버퍼와 후면 버퍼의 포인터만 교환하도록해서 더블 버퍼링보다 더 효율적으로 사용할 수 있는

스왑 체인 방식을 사용한다고 한다.

 

hDeviceWindow = g_hWND;

-> 현재 디바이스의 윈도우

 

Windowed = TRUE;

-> TRUE일 경우 창모드, FALSE일 경우 전체화면 모드.

-> MFC에선 창모드로 사용해야한다.

 

EnableAutoDepthStencil = TRUE;

-> Direct3D에서 깊이 버퍼를 관리하면 true이고, 그렇지 않으면 false 

 

AutoDepthStencilFormat = D3DFMT_D24S8;

-> 장치에서 만드는 깊이 스텐실 표면의 DepthFormat을 검색하거나 설정합니다.

 

FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

 

D3DDEVTYPE_HAL

-> 하드웨어 래스터 화. 셰이딩은 소프트웨어, 하드웨어 또는 혼합 변환 및 조명으로 수행된다.

 

#2. 디바이스 삭제

if (m_pDevice)
    m_pDevice->Release(); 
if (m_pSDK)
	m_pSDK->Release(); 

Device 안에서 내부적으로 LPDIRECT3D9을 참조해서 사용하고 있기 때문에,

반드시 Device를 먼저 제거 후 LPDIRECT3D9를 제거해야 메모리 누수가 발생하지 않는다.

 

'Programming > MFC' 카테고리의 다른 글

MFC - 기본 이론 , 계층 구조  (0) 2020.11.29
MFC - 타일 픽킹(내적)  (0) 2020.11.29
MFC - 타일 픽킹(직선의 방정식)  (0) 2020.11.25
MFC - 타일 배치  (0) 2020.11.25
MFC - 싱글 텍스처, 멀티 텍스처  (0) 2020.11.22

+ Recent posts