https://docs.microsoft.com/en-us/previous-versions//ff729719(v=vs.85)?redirectedfrom=MSDN
์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
GPU๊ฐ ์ผ๊ฐํ์ ๋ ๋๋งํ๊ธฐ ์ํด์๋ ์ผ๊ฐํ์ ๊ผญ์ง์ ์์น 3๊ฐ๊ฐ ์ฃผ์ด์ ธ์ผ ํ๋ค.
์ ์ ๋ฒํผ์ ๊ผญ์ง์ 3๊ฐ๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค.
์ ์ ์ ์์น, ๋ ธ๋ฉ, ์์, ํ ์ค์ฒ ์ขํ(ํ ์ค์ฒ ๋งคํ์ ์ด์ฉ) ๋ฑ์ ๊ฐ์ง๊ณ ์๋ค. ์ ์ ๋ ์ด์์์ ์ด๋ฌํ ์์ฑ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ป๊ฒ ์์นํ๋์ง๋ฅผ ๋ํ๋ธ๋ค. (๊ฐ ์์ฑ๋ค์ด ์ด๋ค ๋ฐ์ดํฐ ํ์ ์ ์ด์ฉํ๋์ง, ๊ฐ ์์ฑ์ ์ฌ์ด์ฆ๋ ์ผ๋ง์ธ์ง, ์ ์ฅ๋ ์์ ๋ฑ)
๊ฐ ์์ฑ์ ๋ค๋ฅธ ํ์ ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ์กฐ์ฒด๋ก ํํํ๋ค. ์ ์ ์ ์ฌ์ด์ฆ๋ ๊ตฌ์กฐ์ฒด์ ์ฌ์ด์ฆ๋ก ์ฝ๊ฒ ์ป์ ์ ์๋ค.
struct SimpleVertex
{
XMFLOAT3 Pos; // Position
};
์ด๊ฑธ GPU์ ๊ณต๊ธํ๊ธฐ ์ํด์๋ input layout์ ์๊ณ ์์ด์ผ ํ๋ค. (GPU๋ ์ด๊ฒ ์ ์ ์ ๋ํ ์ ๋ณด๋ผ๋๊ฑธ ๋ชจ๋ฅธ๋ค)
Direct3D 11์์ input layout์ GPU๊ฐ ์ดํดํ ์ ์๋ ํํ๋ก ์ ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ค๋ช ํ๋ ๊ฒ์ด๋ค. ๊ฐ ์ ์ ์์ฑ๋ค์ D3D11_INPUT_ELEMENT_DESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์ค๋ช ๋ ์ ์๋ค.
D3D11_INPUT_ELEMENT_DESC์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณด์.
๐ D3D11_INPUT_ELEMENT_DESC
: Semantic name์ ์์์ ์ฑ๊ฒฉ์ด๋ ๋ชฉ์ ์ ์ค๋ช ํ๋ ๋ฌธ์์ด๋ก GPU์๊ฒ ์ด๊ฒ ๋ญ์ง (์ ์ ์ธ์ง, ๋ ธ๋ฉ์ธ์ง ๋ฑ)์ ์๋ ค์ฃผ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ POSITION์ด๋ค.
: ์ ์ ์ ๋์ผํ ์ฑ์ง์ ์ฌ๋ฌ ์์ฑ์ ๊ฐ์ง ์ ์๋ค. ์๋ฅผ ๋ค์ด ์์์ด 2๊ฐ ์ผ์๋ ์๊ณ ํ ์ค์ฒ ์ขํ๊ฐ 2๊ฐ ์ผ ์๋ ์๋ค. ์ด ๋ ๊ฐ์ COLOR ์ด๋ผ๋ Semantic name์ ์ฐ๋ฉด์ Semantic index๋ฅผ 0๊ณผ 1๋ก ์ค์ ํด์ค๋ค.
: ์์์ ์ฌ์ฉํ ๋ฐ์ดํฐ ํ์ ์ ์ ์ํ๋ค. ์๋ฅผ ๋ค์ด DXGI_FORMAT_R32G32B32_FLOAT์ 3๊ฐ์ 32๋นํธ float์ ๊ฐ์ง๊ณ ์์ด ์ด 12byte๊ฐ ๋๋ค.
: Direct3D 11์์ GPU์ ์ต๋ 16๊ฐ์ ์ ์ ๋ฒํผ๊ฐ ๋์์ ๊ณต๊ธ๋ ์ ์๋ค. ๊ฐ ์ ์ ๋ฒํผ๋ 0๋ถํฐ 15๊น์ง์ ์ซ์๋ฅผ ๊ฐ์ง๋ค. InputSlot์ด ์ด ์ซ์๋ฅผ ์ด์ฉํด์ ๋ญ ๊ฐ์ ธ์ฌ๊ฑด์ง ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
: AlignedByteOffeset์ GPU์ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ์ ๋ฒํผ๊ฐ ์์๋๋ ์์น๋ฅผ ์๋ ค์ค๋ค.
: ์ฌ๊ธฐ์ ์ผ๋ฐ์ ์ผ๋ก D3D11_INPUT_PER_VERTEX_DATA๋ฅผ ์ด๋ค.
: ์ธ์คํด์คํ์ ์ฌ์ฉ๋๋ค. ํํ ๋ฆฌ์ผ์์๋ ์ธ์คํด์คํ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก 0์ผ๋ก ์ค์ ํ๋ค.
์ด์ D3D11_INPUT_ELEMENT_DESC ๋ฐฐ์ด์ ์ฑ์ ๋์ผ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
// Define the input layout
D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = ARRAYSIZE(layout);
// Create the input layout
if( FAILED( g_pd3dDevice->CreateInputLayout( layout, numElements, pVSBlob->GetBufferPointer(),
pVSBlob->GetBufferSize(), &g_pVertexLayout ) ) )
return FALSE;
// Set the input layout
g_pImmediateContext->IASetInputLayout( g_pVertexLayout );
์ด๊ธฐํํ ๋์ ํด์ผํ ์ผ ์ค ํ๋๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์ ๋ฒํผ(vertex buffer)๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
Direct3D 11์์ ์ ์ ๋ฒํผ๋ฅผ ๋ง๋ค๋ ค๋ฉด D3D11_BUFFER_DESC, D3D11_SUBRESOURCE_DATA ๋๊ฐ์ง ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ID3D11Device::CreateBuffer()๋ฅผ ํธ์ถํด์ผ ํ๋ค.
์ ์ ๋ฒํผ์ ๋ณต์ฌ๋ ๋ฐ์ดํฐ๋ ์๋ ์ฝ๋์์ SimpleVertex์ ์ ์ฅ๋ 3๊ฐ์ ์ ์ ๋ค์ด๋ค.
์ ์ ๋ฒํผ๊ฐ ์์ฑ๋ ํ ID3D11DeviceContext::IASetVertexBuffers()๋ฅผ ํธ์ถํ๋ค.
๐ vertex buffer ๋ง๋ค๊ธฐ
// Create vertex buffer
SimpleVertex vertices[] =
{
XMFLOAT3( 0.0f, 0.5f, 0.5f ),
XMFLOAT3( 0.5f, -0.5f, 0.5f ),
XMFLOAT3( -0.5f, -0.5f, 0.5f ),
};
D3D11_BUFFER_DESC bd;
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof( SimpleVertex ) * 3;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
bd.MiscFlags = 0;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory( &InitData, sizeof(InitData) );
InitData.pSysMem = vertices;
if( FAILED( g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer ) ) )
return FALSE;
// Set vertex buffer
UINT stride = sizeof( SimpleVertex );
UINT offset = 0;
g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );
Primitive Topology ๋ GPU๊ฐ ์ผ๊ฐํ์ ๋ ๋๋งํ๋๋ฐ ํ์ํ 3๊ฐ์ ์ ์ ์ ์ป๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
๋ง์ฝ ์ผ๊ฐํ์ 2๊ฐ ๊ทธ๋ฆฌ๊ณ ์ถ๋ค๋ฉด GPU์ 6๊ฐ์ ์ ์ ์ ๋ณด๋ด๋ฉด ๋๊ณ ์ด ๋ topology๋ฅผ ์ผ๊ฐํ ๋ฆฌ์คํธ(triangle list)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ผ๊ฐํ ๋ฆฌ์คํธ๋ ์ดํด๊ฐ ์ฝ์ง๋ง, ๋นํจ์จ์ ์ด๋ค. ์ฌ๋ฌ๊ฐ์ ์ผ๊ฐํ์ด ์ ์ ์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ ํ ์ ์ ์ด ์ฌ๋ฌ๋ฒ ์ ์ฅ๋๋ค.
A B C C B D
์ ๊ทธ๋ฆผ์ฒ๋ผ ์ผ๊ฐํ์ด ๋๊ฐ์ ๊ผญ์ง์ ์ ๊ณต์ ํ๋ค๋ฉด ๋จผ์ ๊ทธ๋ ค์ง ์ผ๊ฐํ์์ ๋ ๊ฐ์ ์ ์ ์ ์ฌ์ฉํ๊ณ ์ ์ ๋ฒํผ์์ ํ๊ฐ๋ง ๊ฐ์ ธ์จ๋ค๋ฉด ํจ์ฌ ํจ์จ์ ์ผ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ ๋ topology๋ triangle strip์ด๋ค.
triangle strip์ ์ด์ฉํ๋ฉด ๋๋ฒ์งธ ์ผ๊ฐํ์ ๊ทธ๋ฆด ๋ ์ด์ ์ผ๊ฐํ์์ ๋ง์ง๋ง ๋ ์ ์ ์ ๊ฐ์ ธ์ค๊ณ , ์ ์ ๋ฒํผ์์ ๊ทธ ๋ค์ ์ ์ ์ ํ๋ ๊ฐ์ ธ์จ๋ค.
A B C D
์ ๋ํ์ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ ๋ฌ๋๋ค.
A B C D E
๋๋ฒ์งธ, ๋ค๋ฒ์งธ, ์ฌ์ฏ๋ฒ์งธ ์ผ๊ฐํ ๋ฑ์ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ์ ์ ์ด ์ฃผ์ด์ง๋ค.
(๊ธฐ๋ณธ์ ์ผ๋ก ์๊ณ)
๐ ์ผ๊ฐํ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ topology ์ค์
// Set primitive topology
g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
์ด์ ์ผ๊ฐํ์ ๋ ๋๋งํด๋ณด์. ๋ ๋๋ง์ ์ํด ์ ์ ์ ฐ์ด๋์ ํฝ์ ์ ฐ์ด๋ ๋๊ฐ๋ฅผ ๋ง๋ค์๋ค. ์ ์ ์ ฐ์ด๋๋ ์ผ๊ฐํ์ ์ ์ ๋ค์ ์ฌ๋ฐ๋ฅธ ์์น๋ก ๋ณํ(space transform)ํ๋ ์ญํ ์ ํ๋ค. ํฝ์ ์ ฐ์ด๋๋ ์ผ๊ฐํ์ ๊ฐ ํฝ์ ์ ์์์ ๊ณ์ฐํ๋ค. (์ด๊ฑด ๋ค์ ํํ ๋ฆฌ์ผ์์)
์ด๋ฌํ ์ ฐ์ด๋๋ค์ ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ๊ฐ ID3D11DeviceContext::VSSetShader(), ID3D11DeviceContext::PSSetShader()์ ํธ์ถํ๋ฉด ๋๋ค.
๋ง์ง๋ง์ผ๋ก ID3D11DeviceContext::Draw()๋ฅผ ํธ์ถํ์ฌ ํ์ฌ ์ ์ ๋ฒํผ, ์ ์ ๋ ์ด์์, primitive topology ๋ฑ์ ์ฌ์ฉํ์ฌ GPU๊ฐ ๋ ๋๋งํ๋๋ก ํ๋ฉด ๋๋ค.
Draw()์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ GPU๋ก ๋ณด๋ผ ์ ์ ์์ด๊ณ , ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๋ณด๋ผ ์ฒซ๋ฒ์งธ ์ ์ ์ ์ธ๋ฑ์ค์ด๋ค. ์ฐ๋ฆฌ๋ ํ๋์ ์ผ๊ฐํ์ ๋ ๋๋งํ๊ณ ์ ์ ๋ฒํผ์ ์ฒ์์์๋ถํฐ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ 3, 0 ์ ํด๋นํ๋ค.
// Render a triangle
g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );
g_pImmediateContext->Draw( 3, 0 );