๐ Direct3D Tutorial2
https://docs.microsoft.com/en-us/previous-versions//ff729719(v=vs.85)?redirectedfrom=MSDN
์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
Tutorial2 : ์ผ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
๐ Elements of a Triangle (์ผ๊ฐํ์ ์์)
GPU๊ฐ ์ผ๊ฐํ์ ๋ ๋๋งํ๊ธฐ ์ํด์๋ ์ผ๊ฐํ์ ๊ผญ์ง์ ์์น 3๊ฐ๊ฐ ์ฃผ์ด์ ธ์ผ ํ๋ค.
์ ์ ๋ฒํผ์ ๊ผญ์ง์ 3๊ฐ๋ฅผ ์ ์ฅํ๋ฉด ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ฐ ์ ์ ์ ๋ฒํผ์ ์ ์ฅํ๊ธฐ ์ํด์๋ ๋ช ๋ฐ์ดํธ๊ฐ ํ์ํ์ง ์์๋ณด์. ๋จผ์ ์ ์ ๋ ์ด์์์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค.
๐ Input Layout
์ ์ ์ ์์น, ๋ ธ๋ฉ, ์์, ํ ์ค์ฒ ์ขํ(ํ ์ค์ฒ ๋งคํ์ ์ด์ฉ) ๋ฑ์ ๊ฐ์ง๊ณ ์๋ค. ์ ์ ๋ ์ด์์์ ์ด๋ฌํ ์์ฑ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ป๊ฒ ์์นํ๋์ง๋ฅผ ๋ํ๋ธ๋ค. (๊ฐ ์์ฑ๋ค์ด ์ด๋ค ๋ฐ์ดํฐ ํ์ ์ ์ด์ฉํ๋์ง, ๊ฐ ์์ฑ์ ์ฌ์ด์ฆ๋ ์ผ๋ง์ธ์ง, ์ ์ฅ๋ ์์ ๋ฑ)
๊ฐ ์์ฑ์ ๋ค๋ฅธ ํ์ ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ์กฐ์ฒด๋ก ํํํ๋ค. ์ ์ ์ ์ฌ์ด์ฆ๋ ๊ตฌ์กฐ์ฒด์ ์ฌ์ด์ฆ๋ก ์ฝ๊ฒ ์ป์ ์ ์๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ๊ผญ์ง์ ์ ์์น์ ๋ํด์๋ง ์ค๋ช
ํ๋ค.
๋ฐ๋ผ์ XMFLOAT3 ํ์
๋ง ์ด์ฉํ์ฌ ์ ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ๋ค. XMFLOAT3๋ float 3๊ฐ์ ๋ฒกํฐ์ด๋ค.
struct SimpleVertex
{
XMFLOAT3 Pos; // Position
};
์ด๊ฑธ GPU์ ๊ณต๊ธํ๊ธฐ ์ํด์๋ input layout์ ์๊ณ ์์ด์ผ ํ๋ค. (GPU๋ ์ด๊ฒ ์ ์ ์ ๋ํ ์ ๋ณด๋ผ๋๊ฑธ ๋ชจ๋ฅธ๋ค)
Direct3D 11์์ input layout์ GPU๊ฐ ์ดํดํ ์ ์๋ ํํ๋ก ์ ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ค๋ช
ํ๋ ๊ฐ์ฒด์ด๋ค. ๊ฐ ์ ์ ์์ฑ๋ค์ D3D11_INPUT_ELEMENT_DESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์ค๋ช
๋ ์ ์๋ค.
์ดํ๋ฆฌ์ผ์ด์
์ D3D11_INPUT_ELEMENT_DESC ๋ฐฐ์ด์ ํ๋ ์ด์ ์ ์ํ ๋ค์, ์ ์ฒด ์ ์ ์ ์์ ํ๋ input layout ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
D3D11_INPUT_ELEMENT_DESC์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณด์.
๐ D3D11_INPUT_ELEMENT_DESC
- SemanticName
: Semantic name์ ์์์ ์ฑ๊ฒฉ์ด๋ ๋ชฉ์ ์ ์ค๋ช ํ๋ ๋ฌธ์์ด์ด๋ค. ์ฌ๊ธฐ์ POSITION์ด๋ค.
- SemanticIndex
: ์ ์ ์ ๋์ผํ ์ฑ์ง์ ์ฌ๋ฌ ์์ฑ์ ๊ฐ์ง ์ ์๋ค. ์๋ฅผ ๋ค์ด ์์์ด 2๊ฐ ์ผ์๋ ์๊ณ ํ ์ค์ฒ ์ขํ๊ฐ 2๊ฐ ์ผ ์๋ ์๋ค. ์ด ๋ ๊ฐ์ COLOR ์ด๋ผ๋ Semantic name์ ์ฐ๋ฉด์ Semantic index๋ฅผ 0๊ณผ 1๋ก ์ค์ ํด์ค๋ค.
- Format
: ์์์ ์ฌ์ฉํ ๋ฐ์ดํฐ ํ์ ์ ์ ์ํ๋ค. ์๋ฅผ ๋ค์ด DXGI_FORMAT_R32G32B32_FLOAT์ 3๊ฐ์ 32๋นํธ float์ ๊ฐ์ง๊ณ ์์ด ์ด 12byte๊ฐ ๋๋ค.
- InputSlot
: Direct3D 11์์ GPU์ ์ต๋ 16๊ฐ์ ์ ์ ๋ฒํผ๊ฐ ๋์์ ๊ณต๊ธ๋ ์ ์๋ค. ๊ฐ ์ ์ ๋ฒํผ๋ 0๋ถํฐ 15๊น์ง์ ์ซ์๋ฅผ ๊ฐ์ง๋ค. InputSlot์ด ์ด ์ซ์๋ฅผ ์ด์ฉํด์ ๋ญ ๊ฐ์ ธ์ฌ๊ฑด์ง ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
- AlignedByteOffset
: AlignedByteOffeset์ GPU์ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ์ ๋ฒํผ๊ฐ ์์๋๋ ์์น๋ฅผ ์๋ ค์ค๋ค.
- InputSlotClass
: ์ฌ๊ธฐ์ ์ผ๋ฐ์ ์ผ๋ก D3D11_INPUT_PER_VERTEX_DATA๋ฅผ ์ด๋ค.
- InstanceDataStepRate
: ์ธ์คํด์คํ์ ์ฌ์ฉ๋ฉ๋๋ค. ํํ ๋ฆฌ์ผ์์๋ ์ธ์คํด์คํ๋ฅผ ์ฌ์ฉํ์ง 0์ผ๋ก ์ค์ ํ๋ค.
์ด์ input layout์ ๋ง๋ค๊ธฐ ์ํด 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);
๐ Vertex Layout
vetex shader๋ vertex layout์ด ๋ฐ์ ํ๊ฒ ์ฐ๊ด๋์ด ์๋ค. vertex layout์ ๋ง๋ค๋ ค๋ฉด vertext shader์ input signature์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
D3DX11CompileFromFile์์ ๋ฐํ๋๋ ID3DBlob ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ์ ์ ์ ฐ์ด๋์ input signature์ ๋ํ๋ด๋ ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค.
์ฐ๋ฆฌ๊ฐ ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ฐ๋ฆฌ๋ ID3D11Device::CreateInputLayout()๋ฅผ ๋ถ๋ฌ์ vertext layout ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๊ณ , ID3D11DeviceContext::IASetInputLayout()๋ก ํ์ฑํ ์ํฌ ์ ์๋ค.
// 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 );
๐ Creating Vertex Buffer
์ด๊ธฐํํ ๋์ ํด์ผํ ์ผ ์ค ํ๋๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์ ๋ฒํผ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
Direct3D 11์์ ์ ์ ๋ฒํผ๋ฅผ ๋ง๋ค๋ ค๋ฉด D3D11_BUFFER_DESC, D3D11_SUBRESOURCE_DATA ๋๊ฐ์ง ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ID3D11Device::CreateBuffer()๋ฅผ ํธ์ถํด์ผ ํ๋ค.
- D3D11_BUFFER_DESC : ์ ์ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ค.
- D3D11_SUBRESOURCE_DATA : ์ ์ ๋ฒํผ์ ๋ณต์ฌ๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค.
์ ์ ๋ฒํผ์ ๋ณต์ฌ๋ ๋ฐ์ดํฐ๋ ์๋ ์ฝ๋์์ 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
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 );
๐ Rendering the Triangle
์ด์ ์ผ๊ฐํ์ ๋ ๋๋งํด๋ณด์. ๋ ๋๋ง์ ์ํด ์ ์ ์ ฐ์ด๋์ ํฝ์ ์ ฐ์ด๋ ๋๊ฐ๋ฅผ ๋ง๋ค์๋ค. ์ ์ ์ ฐ์ด๋๋ ์ผ๊ฐํ์ ์ ์ ๋ค์ ์ฌ๋ฐ๋ฅธ ์์น๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ค. ํฝ์ ์ ฐ์ด๋๋ ์ผ๊ฐํ์ ๊ฐ ํฝ์ ์ ์์์ ๊ณ์ฐํ๋ค. (์ด๊ฑด ๋ค์ ํํ ๋ฆฌ์ผ์์)
์ด๋ฌํ ์ ฐ์ด๋๋ค์ ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ๊ฐ 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 );
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ Direct3D Tutorial2), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@mi_pine/Direct3D-Tutorial2์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค