https://docs.microsoft.com/en-us/previous-versions//ff729722(v=vs.85)?redirectedfrom=MSDN
์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค.
์ ์ ์์ ์ํํ ์ ์๋ ๋ณํ์๋ 3๊ฐ์ง ์ ํ์ด ์๋ค.
์ด๋, ํ์ , ์ค์ผ์ผ๋ง.
XNA Math ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋, ํ์ , ์ค์ผ์ผ๋ง, ์๋-๋ทฐ ๋ณํ, ๋ทฐ-ํฌ์ ๋ณํ๊ณผ ๊ฐ์ API๊ฐ ํฌํจ๋์ด ์๋ค.
๐ ์ด๋์ ์ฌ์ฉ๋๋ ํ๋ ฌ
1 0 0 0
0 1 0 0
0 0 1 0
a b c 1
์ฌ๊ธฐ์ (a, b, c)๋ ์ด๋ํ ๋ฐฉํฅ๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ํ๋ ๋ฒกํฐ์ด๋ค.
์๋ฅผ ๋ค์ด x์ถ์ผ๋ก -5๋งํผ ์ด๋ํ๊ฒ ํ๋ ค๋ฉด ์๋ ํ๋ ฌ์ ๊ณฑํ๋ฉด ๋๋ค.
๐ x์ถ์ผ๋ก -5๋งํผ ์ด๋
1 0 0 0
0 1 0 0
0 0 1 0
-5 0 0 1
ํ์ ์ ์์ ์ ํต๊ณผํ๋ X, Y, Z ์ถ์ ์ค์ฌ์ผ๋ก ์ผ์ด๋๋ค.
์๋ฅผ ๋ค์ด [1 0]๋ฅผ ๋ฐ์๊ณ๋ก 90๋ ํ์ ์ํค๋ฉด [0 1]์ด ๋๋ค.
๐ y์ถ์ ๊ธฐ์ค์ผ๋ก ์๊ณ ๋ฐฉํฅ์ผ๋ก i๋ ํ์ ์ํค๋ ํ๋ ฌ
cosฮ 0 -sinฮ 0
0 1 0 0
sinฮ 0 cosฮ 0
0 0 0 1
์ค์ผ์ผ๋ง์ ์ถ ๋ฐฉํฅ์ ๋ฐ๋ผ ํ๋ํ๊ฑฐ๋ ์ถ์ํ๋ ๊ฒ์ ๋งํ๋ค.
๋ชจ๋ ๋ฐฉํฅ์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์๋ ์๊ณ ํ๋์ ์ถ๋ง ๋ฐ๋ผ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์๋ ์๋ค.
๐ ์ค์ผ์ผ๋ง ์ํค๋ ํ๋ ฌ
p 0 0 0
0 q 0 0
0 0 r 0
0 0 0 1
๋ฒกํฐ์ ๋ค์ค ๋ณํ์ ์ ์ฉํ๋ ค๋ฉด ์ฒซ ๋ฒ์งธ ๋ณํ ํ๋ ฌ์ ๊ณฑํ ๋ค์ ๊ทธ ํ๋ ฌ์ ๋ ๋ฒ์งธ ๋ณํ ํ๋ ฌ์ ๊ณฑํ๋ฉด ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ์ ์๋ฆฌ์์ ํ์ ํ๋ ํ๋ธ์, ์์ ์ ์ถ์ ๋ํด ํ์ ํจ๊ณผ ๋์์ ๋ค๋ฅธ ํ๋ธ๋ฅผ ํ์ ํ๋ ํ๋ธ 2๊ฐ๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค.
XNA Math์ ํ์ , ์ด๋ ๋ฐ ์ค์ผ์ผ๋ง ํ๋ ฌ์ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ ๊ธฐ๋ฅ์ด ์๋ค.
์ฒซ ๋ฒ์งธ ์ ์ก๋ฉด์ฒด๋ ์ ์๋ฆฌ์์ ํ์ ํ๊ณ ๊ถค๋์ ์ค์ฌ ์ญํ ์ ํ ๊ฒ์ด๋ค. XMMatrixRotationY ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋๋ค. ํ๋ธ๋ ๊ฐ ํ๋ ์์ ์ค์ ๋ ์๋งํผ ํ์ ํ๋ค.
// 1st Cube: Rotate around the origin
g_World1 = XMMatrixRotationY( t );
๋ ๋ฒ์งธ ์ ์ก๋ฉด์ฒด๋ ์ฒซ ๋ฒ์งธ ์ ์ก๋ฉด์ฒด ์ฃผ์๋ฅผ ๊ณต์ ํ๋ค.
๋จผ์ ์ ์ก๋ฉด์ฒด์ ํฌ๊ธฐ๊ฐ 30%๋ก ์ถ์๋ ๋ค์, ์ถ(์ด ๊ฒฝ์ฐ z์ถ)์ ๋ฐ๋ผ ํ์ ํ๋ค.
๊ถค๋๋ฅผ ๋๊ฒ ํ๊ธฐ ์ํด ์์ ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ๊ณณ์ผ๋ก ์ด๋์ํจ๋ค์ y์ถ์ ๋ฐ๋ผ ํ์ ํ๋ค.
์ํ๋ ๊ฒฐ๊ณผ๋ 4๊ฐ์ ํ๋ ฌ(mScale, mSpin, mTranslate, mOrbit)์ ๊ณฑ์ผ๋ก ์ป์ ์ ์๋ค.
// 2nd Cube: Rotate around origin
XMMATRIX mSpin = XMMatrixRotationZ( -t );
XMMATRIX mOrbit = XMMatrixRotationY( -t * 2.0f );
XMMATRIX mTranslate = XMMatrixTranslation( -4.0f, 0.0f, 0.0f );
XMMATRIX mScale = XMMatrixScaling( 0.3f, 0.3f, 0.3f );
g_World2 = mScale * mSpin * mTranslate * mOrbit;
t : ์๊ฐ
์๊ฐ์ ์ด์ฉํ์ฌ ์ ๋ฐ์ดํธ๋ฅผ ์ํค๋ฏ๋ก t ๊ฐ์ ์ฆ๊ฐ์์ผ ์ฃผ์ด์ผ ํ๋ค.
// Update our time
t += XM_PI * 0.0125f;
๋ ๋๋ง์ ํ๊ธฐ ์ ์ ์ ฐ์ด๋์ ๋ํด ์์ ๋ฒํผ๋ฅผ ์ ๋ฐ์ดํธ ํด์ผ ํ๋ค. ์๋ ๋ณํ ํ๋ ฌ์ ํ๋ธ๋ง๋ค ๊ณ ์ ํ๋ฏ๋ก ๋ชจ๋ ํ๋ธ์ ๊ฐ๊ฐ ์ ์ฉ๋๋ค.
//
// Update variables for the first cube
//
ConstantBuffer cb1;
cb1.mWorld = XMMatrixTranspose( g_World1 );
cb1.mView = XMMatrixTranspose( g_View );
cb1.mProjection = XMMatrixTranspose( g_Projection );
g_pImmediateContext->UpdateSubresource( g_pConstantBuffer, 0, NULL, &cb1, 0, 0 );
//
// Render the first cube
//
g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer );
g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );
g_pImmediateContext->DrawIndexed( 36, 0, 0 );
//
// Update variables for the second cube
//
ConstantBuffer cb2;
cb2.mWorld = XMMatrixTranspose( g_World2 );
cb2.mView = XMMatrixTranspose( g_View );
cb2.mProjection = XMMatrixTranspose( g_Projection );
g_pImmediateContext->UpdateSubresource( g_pConstantBuffer, 0, NULL, &cb2, 0, 0 );
//
// Render the second cube
//
g_pImmediateContext->DrawIndexed( 36, 0, 0 );
Depth Buffer๊ฐ ์๋ค๋ฉด ๊ถค๋๋ฅผ ๋๋ ์์ ์ ์ก๋ฉด์ฒด๊ฐ ๋ค๋ฅผ ๋ ๋ ๋ค๋ฅธ ์ ์ก๋ฉด์ฒด ๋ค๊ฐ ์๋ ์์ ๊ทธ๋ ค์ง ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๊น์ด ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ Direct3D ํ๋ฉด์ ๊ทธ๋ ค์ง ๋ชจ๋ ํฝ์
์ ๊น์ด๋ฅผ ํ๋จํด์ฃผ์ด์ผ ํ๋ค.
Direct3D 11์ ๊น์ด ๋ฒํผ๋ ํ๋ฉด์ ๊ทธ๋ ค์ง๋ ๋ชจ๋ ํฝ์
์ ํด๋น ํ๋ฉด ๊ณต๊ฐ ํฝ์
์ ๊น์ด ๋ฒํผ์ ์ ์ฅ๋ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ํ์ธํ๋ค.
๋ ๋๋ง ๋๋ ํฝ์
์ z๊ฐ์ด ๋ฒํผ์ ์ด๋ฏธ ์๋ ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ํฝ์
์ด ๊ทธ๋ ค์ง๊ณ , Depth Buffer์ ๊ฐ์ด ์๋ก ๊ทธ๋ฆฐ ํฝ์
์ ๊น์ด๋ก ์
๋ฐ์ดํธ ๋๋ค. ๋ฐ๋ฉด ๊ทธ๋ฆฌ๋ ค๋ ํฝ์
์ z๊ฐ์ด Depth Buffer์ ๊ธฐ์กด์ ์๋ ๊ฐ๋ณด๋ค ํฌ๋ฉด ํฝ์
์ ๋ฒ๋ ค์ง๊ณ ๊น์ด ๋ฒํผ์ z ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
๐ Depth Buffer์ DepthStencilView๋ฅผ ์์ฑํ์ฌ Depth Stencil texture๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ ํ๋ค.
// Create depth stencil texture
D3D11_TEXTURE2D_DESC descDepth;
ZeroMemory( &descDepth, sizeof(descDepth) );
descDepth.Width = width;
descDepth.Height = height;
descDepth.MipLevels = 1;
descDepth.ArraySize = 1;
descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
descDepth.SampleDesc.Count = 1;
descDepth.SampleDesc.Quality = 0;
descDepth.Usage = D3D11_USAGE_DEFAULT;
descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL;
descDepth.CPUAccessFlags = 0;
descDepth.MiscFlags = 0;
hr = g_pd3dDevice->CreateTexture2D( &descDepth, NULL, &g_pDepthStencil );
if( FAILED(hr) )
return hr;
// Create the depth stencil view
D3D11_DEPTH_STENCIL_VIEW_DESC descDSV;
ZeroMemory( &descDSV, sizeof(descDSV) );
descDSV.Format = descDepth.Format;
descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
descDSV.Texture2D.MipSlice = 0;
hr = g_pd3dDevice->CreateDepthStencilView( g_pDepthStencil, &descDSV, &g_pDepthStencilView );
if( FAILED(hr) )
return hr;
์๋ก ๋ง๋ Depth Stencil Buffer๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด device์ ๋ฐ์ธ๋ฉํด์ผ ํ๋ค. ์ด ์์ ์ Depth Stencil View๋ฅผ OMSetRenderTargets ํจ์์ ์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ์ฌ ์ํ๋๋ค.
g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, g_pDepthStencilView );
๋ ๋ ํ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ๋๋ง ์ ์ Depth Buffer๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ค.
//
// Clear the depth buffer to 1.0 (max depth)
//