์์ :)
https://github.com/eazuooz/YamYamEngine/commit/aa0c1d6683a1facaa711123b71be8028285d5d14
Default Compute shader · eazuooz/YamYamEngine@aa0c1d6
Show file tree Showing 19 changed files with 253 additions and 51 deletions.
github.com
DirectX์์ ์ปดํจํ
์
ฐ์ด๋๋ GPU(๊ทธ๋ํฝ ์ฒ๋ฆฌ ์ฅ์น)์์ ์คํ๋๋ฉฐ ๋ฒ์ฉ ์ปดํจํ
์์
์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ์
ฐ์ด๋์ ํ ์ ํ์
๋๋ค. ์ด๋ฏธ์ง๋ฅผ ๋ ๋๋งํ๊ณ ์๊ฐ ํจ๊ณผ๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์กด ๊ทธ๋ํฝ ์
ฐ์ด๋์ ๋ฌ๋ฆฌ ์ปดํจํ
์
ฐ์ด๋๋ ๊ทธ๋ํฝ๊ณผ ์ง์ ๊ด๋ จ์ด ์๋ ๋ณต์กํ ์ํ์ ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์
์ ์ํํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ปดํจํ
์
ฐ์ด๋๋ ๊ณ ๋๋ก ๋ณ๋ ฌ์ ์ด๋ฉฐ ๋์์ ๋ง์ ๊ณ์ฐ์ ์ํํ ์ ์์ผ๋ฏ๋ก ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์
, ์ค๋์ค ์ฒ๋ฆฌ ๋ฐ ๊ณผํ ์ปดํจํ
๊ณผ ๊ฐ์ ์์
์ ์ ํฉํฉ๋๋ค. ๋ํ ํฌ์คํธ ํ๋ก์ธ์ฑ ํจ๊ณผ, ์ด๋ฏธ์ง ์ฒ๋ฆฌ, AI์ ๊ฐ์ ์์
์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ปดํจํ
์
ฐ์ด๋๋ DirectX 11์ ์ฒ์ ๋์
๋์์ผ๋ฉฐ ์ดํ ๊ทธ๋ํฝ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ธฐ๋ฅ์ด ๋์์ต๋๋ค. ์ปดํจํ
์
ฐ์ด๋๋ ํ์ด ๋ ๋ฒจ ์
ฐ์ด๋ฉ ์ธ์ด(HLSL) ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋๋ฉฐ GPU์์ ์ง์ ์ปดํ์ผ ๋ฐ ์คํํ ์ ์์ด ๊ณ ์ฑ๋ฅ๊ณผ ์งง์ ์ง์ฐ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค.
๊ฐ๋จํ๊ฒ ํ ์ค์ณ์ ํฝ์ ์ ์ปดํจํธ์ ฐ์ด๋๋ฅผ ์ด์ฉํด์ ์ฑ์์ฃผ๋ HLSL ์ฝ๋์ด๋ค.
RWTexture2D<float4> tex : register(u0);
// SV_GroupID : ์ค๋ ๋๊ฐ ์ํ ๊ทธ๋ฃน์ ์ขํ
// SV_GoupThreadID : ๊ทธ๋ฃน ๋ด์์, ์ค๋ ๋์ ์ขํ
// SV_GoupIndex : ๊ทธ๋ฃน ๋ด์์, ์ค๋ ๋์ ์ธ๋ฑ์ค (1์ฐจ์)
// SV_DispatchThreadID : ์ ์ฒด ์ค๋ ๋(๋ชจ๋ ๊ทธ๋ฃน ํตํฉ) ๊ธฐ์ค์ผ๋ก, ํธ์ถ๋ ์ค๋ ๋์ ์ขํ
[numthreads(32, 32, 1)] // ๊ทธ๋ฃน ๋น ์ค๋ ๋ ๊ฐ์ (์ต๋ 1024 ๊น์ง ์ง์ ๊ฐ๋ฅ)
void main(uint3 DTid : SV_DispatchThreadID)
{
if (1024 <= DTid.x || 1024 <= DTid.y)
{
return;
}
tex[DTid.xy] = float4(1.f, 0.f, 0.f, 1.f);
}
์ปดํจํ ์ ฐ์ด๋ ์์๋ 2๊ฐ์ ๋ฒํผ ๋ฆฌ์์ค๋ฅผ ์ ฐ์ด๋์์์ ์ ๋ ฅ ๋ฆฌ์์ค์ ์ถ๋ ฅ ๋ฆฌ์์ค๋ก ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์ฌ์ฉํ๋ค.
๊ตฌ์กฐํ ๋ฒํผ
์ ์ถ๋ ฅ ๋ฒํผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด๊ฐ์ด ์ฌ์ฉํ ์ ์๋ ๋ฒํผ๋ฅผ ๋งํ๋ค.
์ธ์ค๋๋ ์์ธ์ค ๋ทฐ
์ถ๋ ฅ์๋ UAV๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ์์ ๋ทฐ๊ฐ ํ์ํ๋ค.
bool Texture::Create()
{
mTexture->GetDesc(&mDesc);
if (mDesc.BindFlags& (UINT)D3D11_BIND_FLAG::D3D11_BIND_DEPTH_STENCIL)
{
if (!GetDevice()->CreateDepthStencilView(mTexture.Get(), nullptr, mDSV.GetAddressOf()))
return false;
}
if (mDesc.BindFlags & D3D11_BIND_FLAG::D3D11_BIND_RENDER_TARGET)
{
if (!GetDevice()->CreateRenderTargetView(mTexture.Get(), nullptr, mRTV.GetAddressOf()))
return false;
}
if (mDesc.BindFlags & D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE)
{
D3D11_SHADER_RESOURCE_VIEW_DESC tSRVDesc = {};
tSRVDesc.Format = mDesc.Format;
tSRVDesc.Texture2D.MipLevels = 1;
tSRVDesc.Texture2D.MostDetailedMip = 0;
tSRVDesc.ViewDimension = D3D11_SRV_DIMENSION::D3D11_SRV_DIMENSION_TEXTURE2D;
if (!GetDevice()->CreateShaderResourceView(mTexture.Get(), &tSRVDesc, mSRV.GetAddressOf()))
return false;
}
if (mDesc.BindFlags & D3D11_BIND_FLAG::D3D11_BIND_UNORDERED_ACCESS)
{
D3D11_UNORDERED_ACCESS_VIEW_DESC tUAVDesc = {};
tUAVDesc.Format = mDesc.Format;
tUAVDesc.Texture2D.MipSlice = 0;
tUAVDesc.ViewDimension = D3D11_UAV_DIMENSION::D3D11_UAV_DIMENSION_TEXTURE2D;
if (!GetDevice()->CreateUnorderedAccessView(mTexture.Get(), &tUAVDesc, mUAV.GetAddressOf()))
return false;
}
}
ํ ์ค์ฒ๋ฅผ ์์ฑํ ๋ ์ธ์ค๋๋ ์์ธ์ค ๋ทฐ(UAV)๋ก ์์ฑ๊ฐ๋ฅํ๊ฒ๋ ์ต์ ์ ์ถ๊ฐํด์คฌ๋ค.
๋ชจ๋ ์ค๋น๊ฐ ๋๋ฌ์ผ๋ฉด Dispatch ํจ์๋ฅผ ํตํด์ ์ปดํจํธ์ ฐ์ด๋๋ฅผ ์คํํ๋ค.
void ComputeShader::OnExcute()
{
Binds();
GetDevice()->BindComputeShader(mCS.Get());
GetDevice()->Dispatch(mGroupX, mGroupY, mGroupZ);
Clear();
}
'๐ Development Study > ๐ผ GameProgramming 2D' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํฌ์คํธ ํ๋ก์ธ์ฑ ํจ๊ณผ (0) | 2023.06.29 |
---|---|
Particle System (0) | 2023.04.08 |
2D Light (0) | 2023.04.08 |
Animation Event (0) | 2023.03.02 |
Animator, Animation2D (0) | 2023.03.02 |
๋๊ธ