์์ :)
https://github.com/eazuooz/YamYamEngine/commit/83ba804aa603c90876755b4782ed2eac0a126450
constatne buffer , index buffer · eazuooz/YamYamEngine@83ba804
Show file tree Showing 10 changed files with 165 additions and 30 deletions.
github.com
์ ฐ์ด๋์์ ์คํํ๋ ์ฝ๋๋ HLSL ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค.
HLSL๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ปดํ์ผ ํ๋ฉด ๋ฐ์ดํธ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋ค.
ํด๋น ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ ์ธํฐํ์ด์ค๊ฐ ID3DBlob์ธํฐํ์ด์ค ์ด๋ฉฐ ์ด๋ฅผ ํ ํด ์ ฐ์ด๋ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ค.
์์๋ฒ์ ์๋งจํฑ์ค
struct VTX_IN
{
float3 vPos : POSITION;
float4 vColor : COLOR;
};
struct VTX_OUT
{
float4 vPos : SV_Position;
float4 vColor : COLOR;
};
cbuffer TRANSFORM : register(b0)
{
float4 cbPos;
};
VTX_OUT VS_Test(VTX_IN _in)
{
VTX_OUT output = (VTX_OUT) 0.f;
output.vPos = float4(_in.vPos + cbPos.xyz, 1.f);
output.vColor = _in.vColor;
return output;
}
DirectX11 ์์๋ ๋ ๋๋ง ํ์ดํ ๋ผ์ธ์ด ์ด๋ค ๊ฐ์ ๋๊ฒจ์ผ ํ ์ง ์๊ธฐ ์ํด ์๋ณ์ ํด์ผํ ํ์๊ฐ ์๋ค.
๊ทธ๊ฒ์ด '์๋งจํฑ์ค' ์ ์ญํ ์ด๋ฉฐ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ณํ์ง ์๋๋ค.
SV_position ๊ฐ์ SV_๋ก ์์ํ๋ ์๋งจํฑ์ค๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์์ ํน๋ณํ ์๋ฏธ๊ฐ ์๋ ์๋งจํฑ์ค๋ก ์ฌ์ฉ๋๋ค.
Directx11 ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๊ฐ์ฅ ์ฒซ ์คํ ์ด์ง์ ๋ฒํ ์ค์ ฐ์ด๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ ๋ ฅ ์ด์ ๋ธ๋ฌ(Input Assembler)๋ ์ ๋ ฅ ๋ ์ด์์ ์ค๋ธ์ ํธ(Input layout object)์ ์๋ฉํฑ์ค์ ๋ฒํ ์ค์ ฐ์ด๋์ ์ ๋ ฅ์๋ฉํฑ์ค๋ฅผ ๋น๊ตํจ์ผ๋ก์จ ๋ฐ์ดํฐ๊ฐ ํ๋นํ์ง๋ฅผ ๊ฒ์ฆํ๋ ์์ ์ ์ํํ๋ค.
InputLayouts[0].AlignedByteOffset = 0;
InputLayouts[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
InputLayouts[0].InputSlot = 0;
InputLayouts[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
InputLayouts[0].SemanticName = "POSITION";
InputLayouts[0].SemanticIndex = 0;
InputLayouts[1].AlignedByteOffset = 12;
InputLayouts[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
InputLayouts[1].InputSlot = 0;
InputLayouts[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
InputLayouts[1].SemanticName = "COLOR";
InputLayouts[1].SemanticIndex = 0;
GetDevice()->CreateInputLayout(InputLayouts, 2,
shader->GetVSCode()->GetBufferPointer()
, shader->GetVSCode()->GetBufferSize()
, shader->GetInputLayoutAddressOf());
์์๋ฒํผ
์์๋ฒํผ๋ฅผ ํตํด ํ์ดํ๋ผ์ธ์ ์์๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์๋ค.
์์๋ฒํผ๋ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ ์๋ ์์ผ๋ฉฐ ์ด๋ค ๊ธ๋ก๋ฒ ๋ณ์๊ฐ์ด ์ด๋ค ์์๋ฒํผ์ ๋ค์ด์๋๊ฐ๋ฅผ ์ง์ ํ๋ ค๋ฉด
๋ค์๊ณผ ๊ฐ์ด ์ ์ํด์ผ ํ๋ค.
cbuffer TRANSFORM : register(b0)
{
float4 cbPos;
};
๊ตฌ์กฐ์ฒด๋ ๋น์ทํด ๋ณด์ด์ง๋ง ๋ค์์คํ์ด์ค์ ๋ ๋น์ทํ ํํ์ด๋ฉฐ ์ ฐ์ด๋ ์ฝ๋์์๋ ๊ธ๋ก๋ฒ ๋ณ์๋ก ์ง์ ์ ๊ทผํ๋ค.
float4 cbPos;
์์ ๊ฐ์ด ๊ทธ๋ฅ ๊ธ๋ก๋ฒ ํํ์ ๋ณ์๋ก ์ง์ ์ ๊ทผ๋ ๊ฐ๋ฅํ๋ค.
์์๋ฒํผ์ ์์ธ์ค ํ ๋๋ ๊ฐ๊ฐ์ ์์๋ฒํผ๋ฅผ ๊ตฌ์กฐ์ฒด๋ก ํ์ฌ ์ ์ ํด๋๋ค.
์์๋ฒํผ์๋ [ํ์ดํ๋ผ์ธ(์ ฐ์ด๋)๋ก๋ถํฐ ์ ์ ๋ ์ดํด์๋ก ์์ธ์ค] [CPU๋ก ์ธํ ๋น๋ฒํ ๊ฐฑ์ ] ๊ฐ์ ์ฑ๋ฅ์ด ์๊ตฌ๋๋ค.
์ด๋ก ์ธํด ์์๋ฒํผ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์๋ [4๋ฐ์ดํธ ์ผ๋ผ์ด๋๋จผํธ]๋ก [๊ฐ์์ 16๋ฐ์ดํธ] ํํ๋ก๋ ํ ์ ์์ผ๋ฉฐ ์ ์ฒด ์ฌ์ด์ฆ๋ 16์ ๋ฐฐ์(4096 X 16 ๋ฐ์ดํธ)] ๋ผ๋ ์กฐ๊ฑด์ด ๋ถ์ด์๋ค.
์์๋ฒํผ๋ ๋ฒํผ๋ฆฌ์์ค์ ํ ์ข ๋ฅ์ด๋ค. ์ด ๋๋ฌธ์ ๋ฒํ ์ค ๋ฒํผ์ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์์ฑํ๋ค.
๋ฒํ ์ค ๋ฒํผ์ ๋ค๋ฅธ์ ์ ๋ฐ์ธ๋ ํ๋๊ทธ๋ก D3D11_BIND_CONSTANT_BUFFER๋ก ์ฃผ๋๊ฒ ํ๊ณ
๋ฒํผ ์ฌ์ด์ฆ๋ 4096 * 16 ์ดํ์ธ 16๋ฐฐ์๊ฐ ์ด์ด์ผ ํ๋ค๋๊ฒ ์ ๋์ด๋ค.
๋ ์์๋ฒํผ๋ ๋ ๋๋ง์ ํ์ํ ๋์ ๋ณ๊ฒฝํ ์ ์๊ธฐ์ ์๋ธ ๋ฆฌ์์ค์ ์ด๊ธฐํ๋ ์ง์ ํ์ง ์๋๋ค.
์์๋ฒํผ์ ๊ฐ์ ์ฐ๋ ๊ฒ์ Usage๊ฐ D3D11_USAGE_DEFAAULT์ผ ๋์ ์๋ธ๋ฆฌ์์ค์ ์ฐ๋ ๋ฐฉ์๊ณผ
D3D11_USAGE_DYNAMIC์ผ๋์ Map ~ UnMap์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์๋ค.
void GraphicsDevice_DX11::BindConstantBuffer(ID3D11Buffer* buffer, void* data, UINT size)
{
D3D11_MAPPED_SUBRESOURCE subRes = {};
mContext->Map(buffer, 0, D3D11_MAP::D3D11_MAP_WRITE_DISCARD, 0, &subRes);
memcpy(subRes.pData, data, size);
mContext->Unmap(buffer, 0);
}
๊ทธ๋ฆฌ๊ณ ์์๋ฒํผ๊ฐ ์ผ์ด๋์์ ์ด๋ค ์คํ ์ด์ง์์ ์ฌ์ฉ๋ ๊ฒ์ธ์ง ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
void GraphicsDevice_DX11::SetConstantBuffer(ShaderStage stage, CBTYPES type, ID3D11Buffer* buffer)
{
switch (stage)
{
case ya::graphics::ShaderStage::VS:
{
mContext->VSSetConstantBuffers((UINT)type, 1, &buffer);
}
break;
case ya::graphics::ShaderStage::HS:
{
mContext->HSSetConstantBuffers((UINT)type, 1, &buffer);
}
break;
case ya::graphics::ShaderStage::DS:
{
mContext->DSSetConstantBuffers((UINT)type, 1, &buffer);
}
break;
case ya::graphics::ShaderStage::GS:
{
mContext->GSSetConstantBuffers((UINT)type, 1, &buffer);
}
break;
case ya::graphics::ShaderStage::PS:
{
mContext->PSSetConstantBuffers((UINT)type, 1, &buffer);
}
break;
case ya::graphics::ShaderStage::CS:
{
mContext->CSSetConstantBuffers((UINT)type, 1, &buffer);
}
break;
default:
break;
}
}
์ฒซ๋ฒ์จฐ ์ธ์๋ ์ฌ๋กฏ๋ฒํธ, ๋๋ฒ์จฐ๊ฐ ์ค์ ํ ์์๋ฒํผ์ ์, ์ธ๋ฒ์งธ๊ฐ ์์๋ฒํผ์ ์ฃผ์๋ฅผ ์ค์ ํ๋ค.
์์๋ฒํผ๋ฅผ ์ค์ ํํ ์ฌ๋กฏ ๋ฒํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ปดํ์ผ ํ์๋์ ์ ฐ์ด๋ ํจ์์์ ์ค์ ์ฌ์ฉ๋๋ ์์๋ฒํผ๊ฐ ์ฌ๋กฏ0๋ถํฐ ์ฝ๋์ ๊ธฐ์ ๋ ์์๋ก ํ ๋น๋๋ค.
๋ช ์์ ์ผ๋ก ํ๊ณ ์ถ์ผ๋ฉด ์์๋ฒํผ๋ฅผ ์ ์ํ ๋ cbuffer cbufferName : register(b0)์ ์ง์ ํด์ฃผ์ด์ ํ ๋นํ ์ฌ๋กฏ๋ฒํธ๋ฅผ ์ง์ ํ ์ ์๋ค.
์ฐธ๊ณ ๋ก b0 b๋ buffer์ ์ฝ์์ด๋ฉฐ ๊ทธ๋ฐ์ t(ํ ์ค์ณ), c(๋ฒํผ ์คํ์ ), s(์ํ๋ฌ), u(Unorderd Access View)๋ฑ์ด ์๋ค.
์ธ๋ฑ์ค ๋ฒํผ์ ์์ฑ
bool Mesh::CreateIndexBuffer(void* data, UINT Count)
{
mIndexCount = Count;
mIBDesc.ByteWidth = sizeof(UINT) * Count;
mIBDesc.BindFlags = D3D11_BIND_FLAG::D3D11_BIND_INDEX_BUFFER;
mIBDesc.Usage = D3D11_USAGE_DEFAULT;
mIBDesc.CPUAccessFlags = 0;
D3D11_SUBRESOURCE_DATA subData = {};
subData.pSysMem = data;
if (!(GetDevice()->CreateBuffer(&mIBDesc, &subData, mIndexBuffer.GetAddressOf())))
return false;
return true;
}
ํด๋น ์ธ๋ฑ์ค ๋ฒํผ๋ก ๊ทธ๋ ค์ฃผ๋ ค๋ฉด
์ธ๋ฑ์ค ๋ฒํผ๋ฅผ ๋ฐ์ธ๋ฉ ํด์ฃผ๋ฉด ๋๋ค.
void Mesh::BindBuffer()
{
UINT stride = sizeof(renderer::Vertex);
UINT offset = 0;
GetDevice()->BindVertexBuffer(0, 1, mVertexBuffer.GetAddressOf(), stride, offset);
GetDevice()->BindIndexBuffer(mIndexBuffer.Get(), DXGI_FORMAT_R32_UINT, 0);
}
'๐ Development Study > ๐ผ GameProgramming 2D' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Scene, GameObject, Component (0) | 2022.12.21 |
---|---|
Mesh, MeshRenderer (0) | 2022.12.21 |
Drawing a Triangle (0) | 2022.12.06 |
DirectX11 Initilize (0) | 2022.11.29 |
๋ ๋๋ง ํ์ดํ๋ผ์ธ DirectX11 (2) | 2022.11.29 |
๋๊ธ