https://docs.microsoft.com/en-us/previous-versions//ff729718(v=vs.85)?redirectedfrom=MSDN
์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
3D ์ฅ๋ฉด์ ๋ ๋๋งํ ๋ ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ device, immediate context, swap chain ์ธ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
(immediate context๋ direct3d 11์ ์๋ก ๋ฑ์ฅํ ๊ฐ์ฒด์)
1) ๋๋ฐ์ด์ค(device) ๋ ๋ฆฌ์์ค๋ฅผ ๋ง๋ ๋ค.
2) immediate context๋ ๋ฒํผ์ ๋ ๋๋ง์ ์ํํ๋ค.
3) ์ค์ ์ฒด์ธ(swap chain) ์ ์ฅ์น๊ฐ ๋ ๋๋ง๋๋ ๋ฒํผ๋ฅผ ๊ฐ์ ธ์์ ์ค์ ๋ชจ๋ํฐ ํ๋ฉด์ ์ฝํ
์ธ ๋ฅผ ํ์ํ๋ ์ญํ ์ ํ๋ค.
์ค์ ์ฒด์ธ์๋ ๋ ๊ฐ ์ด์์ ๋ฒํผ๊ฐ ์๋๋ฐ, ๋ณดํต ๋ฐฑ ๋ฒํผ์ ํ๋ก ํธ ๋ฒํผ๊ฐ ์๋ค. ํ๋ก ํธ ๋ฒํผ๊ฐ ํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ๊ณต๋๊ณ ์๋ ๋ฒํผ์ด๊ณ , ๋ฐฑ ๋ฒํผ๋ ์์ผ๋ก ๊ทธ๋ ค์ง ํ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ค ๊ทธ๋ ค์ง๊ณ ๋๋ฉด ๋ฐฑ ๋ฒํผ๊ฐ ํ๋ฐํธ ๋ฒํผ๊ฐ ๋๋ค.
์ค์ ์ฒด์ธ์ ๋ง๋ค๊ธฐ ์ํด ์์ฑํ๋ ค๋ ์ค์ ์ฒด์ธ์ ์ค๋ช ํ๋ DXGI_SWAPCHAIN_DESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ฒด์์ผ ํ๋ค.
๐ DXGI_SWAPCHAIN_DESC
BackBufferUsage : ๋ฐฑ ๋ฒํผ๊ฐ ์ด๋ป๊ฒ ์ธ๊ฑด์ง.
๋ฐฑ ๋ฒํผ๋ก ๋ ๋๋ง์ ํด์ฃผ๊ณ ์ ํ๋ฏ๋ก BackBufferUsage๋ก DXGI_USAGE_RENDER_TARGET_OUTPUT ์ผ๋ก ์ค์ ํด์ฃผ์๋ค.
OutputWindow : ์ด๋ค ์ฐฝ์ ์ด๋ฏธ์ง๋ฅผ ํ์ํ ๊ฑด์ง
์ด๋ ๊ฒ ์ค์ ์ด ๋ค ์ฑ์์ง๊ณ ๋๋ฉด ์๋ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
D3D11CreateDeviceAndSwapChain : ์ฅ์น์ ์ค์ ์ฒด์ธ์ ์์ฑํ๋ ํจ์
๐ ๋๋ฐ์ด์ค์ ์ค์ ์ฒด์ธ์ ๋ง๋๋ ์ฝ๋
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 1;
sd.BufferDesc.Width = 640;
sd.BufferDesc.Height = 480;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 60; // 60ํ๋ ์
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // swap chain ๋ฐฑ ๋ฒํผ ์ฉ๋ - ๋ ๋๋ง
sd.OutputWindow = g_hWnd;
sd.SampleDesc.Count = 1; //
sd.SampleDesc.Quality = 0; // ๋ค์ค ์ํ๋ง์ ์ด์ฉํ์ง ์์ผ๋ฏ๋ก
sd.Windowed = TRUE;
if (FAILED(D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, featureLevels, numFeatureLevels,
D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, NULL, &g_pImmediateContext)))
{
return FALSE;
}
๋ค์์ผ๋ก ํ ์ผ์ ์ค์ ์ฒด์ธ์ ๋ฐฑ ๋ฒํผ๋ฅผ render target์ผ๋ก ๋ฐ์ธ๋ฉํด์ผ ํ๊ธฐ์ํด render target view๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค.
render target view๋
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=agebreak&logNo=60114584311
์ ์ฝ๊ฒ ์ค๋ช
์ด ๋์ด์๋ค.
๋จผ์ ๋ฐฑ ๋ฒํผ์ ๊ฐ์ฒด๋ฅผ ์ป๊ธฐ ์ํด GetBuffer()์ ํธ์ถํ๋ค.
์ด๋ฒ์๋ ๊ธฐ๋ณธ render target view๋ง ์์ผ๋ฉด ๋๋ฏ๋ก CreateRenderTargetView์ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ NULL์ ํด๋นํ๋ค.
render target view๋ฅผ ๋ง๋ค์์ผ๋ฉด immediate context์์ OMSetRenderTargets()๋ฅผ ํธ์ถํ์ฌ ํ์ดํ๋ผ์ธ์ ๋ฐ์ธ๋ฉํ ์ ์๋ค.
์ต์ข
์ ์ผ๋ก ํ์ดํ๋ผ์ธ ๋ ๋๋ง์ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ฐฑ ๋ฒํผ์ ๊ธฐ๋ก๋๋ค.
๐ render target view๋ฅผ ๋ง๋ค๊ณ ์ค์
// Create a render target view
ID3D11Texture2D* pBackBuffer;
if (FAILED(g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer)))
return FALSE;
hr = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_pRenderTargetView);
pBackBuffer->Release();
if (FAILED(hr))
return FALSE;
g_pImmediateContext->OMSetRenderTargets(1, &g_pRenderTargetView, NULL);
๋ง์ง๋ง์ผ๋ก ํด์ผํ๋ ๊ฒ์ ๋ทฐํฌํธ๋ฅผ ์ด๊ธฐํํ๋ ๊ฒ์ด๋ค.
๋ทฐํฌํธ๋ clip space coordinate์ด๋ค. (X์ Y๋ -1~1, Z๋ 0~1)
์ผ์ชฝ ์๋จ ์ ์ (0, 0)์ด๋ค. ๋๋น ๋ฐ ๋์ด๋ ๋ ๋ ๋์์ ํฌ๊ธฐ์ ๋์ผํ๊ฒ ์ค์ ํ๋ค.
๐ viewport ์ด๊ธฐํ
D3D11_VIEWPORT vp;
vp.Width = (FLOAT)width;
vp.Height = (FLOAT)height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
g_pImmediateContext->RSSetViewports( 1, &vp );
GetMessage()๋ ๋๊ธฐ์ด์ ๋ฉ์ธ์ง๊ฐ ์์ผ๋ฉด GetMessage()๊ฐ ์ฐจ๋จ๋์ด ๋ฉ์ธ์ง๋ฅผ ์ฌ์ฉํ ์ ์์ ๋๊น์ง ๋ฐํ๋์ง ์๋๋ค.
๋ฉ์ธ์ง๊ฐ ์๋ค์ด์ค๋๋ผ๋ ๊ทธ๋์ ๋ค๋ฅธ ๊ฑธ ์ํํด์ผ ํ๋ฏ๋กGetMessage()๋์ PeekMessage()๋ฅผ ์ฌ์ฉํ๋ค. PeekMessage()๋ ๋๊ธฐ์ด์ ๋ฉ์ธ์ง๊ฐ ์์ด๋ PeekMessage()๊ฐ ์ฆ์ ๋ฐํ๋์ด ๋ ๋๋ง์ ํ ์ ์๋ค.
๐ GetMessage() ๋์ PeekMessage() ์ฌ์ฉํ๊ธฐ
MSG msg = {0};
while( WM_QUIT != msg.message )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
Render(); // Do some rendering
}
}
๋ ๋๋ง์ Render() ํจ์์์ ์๋ฃ๋๋ค.
์์์์๋ ๋จ์ผ ์์ผ๋ก ํ๋ฉด์ ์น ํ๋ค.
์ด๋ฅผ ์ํด ClearRanderTargetView() ํจ์๋ฅผ ์ด์ฉํ๋ค. ํ๋ฉด์ ์ฑ์ฐ๊ณ ์ถ์ ์์์ ์ค์ ํ๋ค์ ClearRenderTargetView()์ ์ ๋ฌํ๋ค. ๋ฐฑ ๋ฒํผ๋ฅผ ์ฑ์ฐ๋ฉด ์ค์ ์ฒด์ธ์ Present() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ ๋๋ง์ ์๋ฃํ๋ค.
Present() : ์ค์ ์ฒด์ธ์ ๋ฐฑ ๋ฒํผ๋ฅผ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋๋ก ํ๋ฉด์ ํ์ํ๋ ์ญํ
๐ ๋ ๋๋ง
void Render()
{
//
// Clear the backbuffer
//
float ClearColor[4] = { 0.0f, 0.125f, 0.6f, 1.0f }; // RGBA
g_pd3dDevice->ClearRenderTargetView( g_pRenderTargetView, ClearColor );
g_pSwapChain->Present( 0, 0 );
}