๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ–ผ GameProgramming 2D

Compute Shader

by eazuooz 2023. 4. 8.

์˜ˆ์ œ :)

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

๋Œ“๊ธ€