※ 본 게시물은 DirectX11을 기준으로 작성한다.
또한 순수하게 학습용이므로 절대적으로는 믿지 말 것.
// "DXApp.cpp"
bool DXApp::InitDirect3D()
{
HRESULT hr;
// 스왑체인 속성 설정 구조체 생성.
DXGI_SWAP_CHAIN_DESC swapDesc;
ZeroMemory(&swapDesc, sizeof(DXGI_SWAP_CHAIN_DESC));
swapDesc.BufferCount = 1;
swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapDesc.OutputWindow = hwnd;
swapDesc.Windowed = true;
swapDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swapDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapDesc.BufferDesc.Width = clientWidth;
swapDesc.BufferDesc.Height = clientHeight;
swapDesc.BufferDesc.RefreshRate.Numerator = 60;
swapDesc.BufferDesc.RefreshRate.Denominator = 1;
swapDesc.SampleDesc.Count = 1;
swapDesc.SampleDesc.Quality = 0;
// 장치 및 스왑체인의 생성.
hr = D3D11CreateDeviceAndSwapChain(
NULL, D3D_DRIVER_TYPE_HARDWARE,
NULL, NULL, NULL, NULL,
D3D11_SDK_VERSION, &swapDesc, &pSwapChain, &pDevice,
NULL, &pDeviceContext);
if (FAILED(hr) == true)
{
MessageBox(NULL, L"장치 생성 실패.", L"오류", MB_OK);
return false;
}
// 스왑체인으로부터 백버퍼 가져오기.
ID3D11Texture2D* pBackBufferTexture;
hr = pSwapChain->GetBuffer(NULL, __uuidof(ID3D11Texture2D), (void**)&pBackBufferTexture);
if (FAILED(hr) == true)
{
MessageBox(NULL, L"백버퍼 생성 실패.", L"오류", MB_OK);
return false;
}
// 렌더타겟 생성.
hr = pDevice->CreateRenderTargetView(pBackBufferTexture, NULL, &pRenderTargetView);
if (FAILED(hr) == true)
{
MessageBox(NULL, L"렌더타겟 생성 실패.", L"오류", MB_OK);
return false;
}
// 렌더타겟 설정.
pDeviceContext->OMSetRenderTargets(1, &pRenderTargetView, NULL);
// 백버퍼 텍스처 해제.
if (pBackBufferTexture != NULL)
{
pBackBufferTexture->Release();
pBackBufferTexture = NULL;
}
return true;
}
<HRESULT>
HRESULT는 함수들의 상태정보를 리턴받을 수 있는 타입이다.
BOOL과마찬가지로 SUCCEEDED/FAILED를 사용하는데,
반드시 리턴값을 받지않아도 된다.
cf.)이와 비슷한것으로 LRESULT가 있는데, 이는 콜백함수에서 쓰이며, Win32환경에서 메시지를 처리 후 운영체제에 신호를 주기위해 사용되는 것이다.
*자세한내용은
http://rockdrumy.tistory.com/801 (참고)
<스왑체인 속성 설정 구조체 생성.>
DXGI_SWAP_CHAIN_DESC swapDesc;
1. swapDesc.BufferCount는 백버퍼 숫자를 의미한다. 프론트버퍼는 무조건 1개가 있다.(그래야 화면을 그리니깐)
2. swapDesc.BufferUsage는 체인을 바꾸는 기법을 나타낸다. DXGI_USAGE_RENDER_TARGET_OUTPUT는 렌더 타겟의 출력을 목적으로한다는 것.
3. swapDesc.OutputWindow는 window창 출력설정하기위한 핸들을 넣어준다.
4. swapDesc.Windowed에서 true창모드 false는 전체화면모드 -->전체화면시 그래픽설정몇개를 더 바꿔야한다.
5. swapDesc.SwapEffect는 두개 화면 전환시 어떠한 효과를 넣을지 설정하는것. DXGI_SWAP_EFFECT_DISCARD 바로바꿔치게 이것을 사용하길 권장.(디스카드모드)
6. swapDesc.BufferDesc.Format 바꿔치기하는 버퍼의 대상(백버퍼를 생성할 포맷설정). R8G8B8A8-> 8이 4개니까 32bit를 뜻한다. UNORM -> unsigned Normalize 0~1사이값으로 정규화시켰다. 픽셀하나당 32비트고 각각 8비트씩 차지하며 데이터는 0~1까지로 설정됨.
7. swapDesc.BufferDesc.Width / Height 생성할 백버퍼의 해상도를 위한것. 윈도우크기와 같게 하기위해 ClientWidth, ClientHeight를 넣어줬다.
8. swapDesc.BufferDesc.RefreshRate.Numerator = 60; swapDesc.BufferDesc.RefreshRate.Denominator = 1;
화면 주사율 설정 -> 장치마다 다르기때문에... 원래는 라이브러리에따라 다르게 설정하는 api가 존재.
우리나라는 60Hz였을때 크게 문제는 되지않을것이긴하지만 필요할시 나중에 바꿔줘야한다.
9. 샘플링 관련 설정. Antialiasing을 해결하기위한 방법을 샘플링이라 한다.
swapDesc.SampleDesc.Count = 1; swapDesc.SampleDesc.Quality = 0;
샘플링을 1개만한다는것은 안하겠다는 뜻과 같다
--> Quality는 Count의 설정에 따라 달라진다.
--> 그래픽카드가 못버티는 수준까지 샘플링을 늘리면 또 안된다.
샘플카운트를 물어보는 api가 따로 존재한다. (super sampling , multi sampling ... ) 지금은 퀄리티를0하는게 맞다. 샘플링을 안한다했으니...
'ComputerScience > DirectX11' 카테고리의 다른 글
DirectX11 3D를 보여주기 위한 윈도우 -(4) Main.cpp (0) | 2018.10.11 |
---|---|
DirectX11 3D를 보여주기 위한 윈도우 -(3) Engine.h, Engine.cpp (0) | 2018.10.10 |
DirectX11 3D를 보여주기 위한 윈도우 - (2) DXApp.cpp -4 (콜백함수 WinProc, MsgProc) (0) | 2018.10.08 |
DirectX11 3D를 보여주기 위한 윈도우 - (2) DXApp.cpp -3 (Init함수, InitWindow함수) (0) | 2018.10.08 |
DirectX11 3D를 보여주기 위한 윈도우 - (2) DXApp.cpp -2 (Run함수 메세지 처리루프) (0) | 2018.10.08 |