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

Texture ์ƒ์„ฑ

by eazuooz 2022. 12. 26.

์˜ˆ์ œ:)

https://github.com/eazuooz/YamYamEngine/commit/ed27ddb9e49182c3dcf4b307336018a5376704f5

 

Texture · eazuooz/YamYamEngine@ed27ddb

Show file tree Showing 38 changed files with 1,505 additions and 322 deletions.

github.com

 

ํ…์Šค์ฒ˜๋Š” ๋‹ค๋ฅธ ์ž์›๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์—์„œ [๋ทฐ]๋ฅผ ํ†ตํ•ด ์—‘์„ธ์Šค ๋œ๋‹ค.

[๋ทฐ]๋Š” [ํ…์Šค์ฒ˜ ๋ฆฌ์†Œ์Šค]๊ฐ€ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ๋ถ€ํ„ฐ ์–ด๋– ํ•œ ๋ฐ์ดํ„ฐ๋กœ ๋ณด์ด๊ฒŒ ํ• ๊ฒƒ์ธ๊ฐ€๋ฅผ ์ •์˜ํ•œ๋‹ค.

 

 

ํ…์Šค์ฒ˜๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋ณธ์ ์ธ ์ˆœ์„œ๋Š”

 

ํ…์Šค์ฒ˜ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ -> ํ…์Šค์ฒ˜ ์ด๋ฏธ์ง€ ๋กœ๋“œ -> ํ…์Šค์ฒ˜์— ์—‘์„ธ์Šค ํ•˜๋Š” ๋ทฐ ์ƒ์„ฑ

 

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ์ง€๋กœ๋“œ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ DirectX์—์„œ ์ œ๊ณต๋˜๋Š” ๋กœ๋“œํ•จ์ˆ˜๋Œ€์‹ ์— DirectXTex๋ผ๋Š” ์ด๋ฏธ์ง€ ๋กœ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. png, bmp, jpg๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€ ํ™•์žฅ์ž ๋กœ๋“œ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.

 

์šฐ๋ฆฌ์˜ ํ…์Šค์ฒ˜ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋ ๊ฒƒ์ด๋‹ค.

	class Texture : public Resource
	{
	public:
		Texture();
		~Texture();

		HRESULT Load(const std::wstring& path) override;
		void BindShader(eShaderStage stage, UINT startSlot);

	private:
		ScratchImage mImage;
		Microsoft::WRL::ComPtr<ID3D11Texture2D> mTexture;
		Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> mSRV;
		D3D11_TEXTURE2D_DESC mDesc;
	};

ScrachImage๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•ด์„œ ๋ณด๊ด€ํ•ด๋‘๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ์ด๋˜๊ณ  Texture2D์— ํ…์Šค์ฒ˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ณด๊ด€ํ•ด๋‘˜๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ID3D11ShaderResourceView์— ํ…์Šค์ฒ˜ ๋ฆฌ์†Œ์Šค์— ์—‘์„ธ์Šคํ• ์ˆ˜์žˆ๋Š” ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋‹ค.

 

    HRESULT __cdecl CreateShaderResourceView(
        _In_ ID3D11Device* pDevice
        , _In_reads_(nimages) const Image* srcImages
        , _In_ size_t nimages
        , _In_ const TexMetadata& metadata,
        _Outptr_ ID3D11ShaderResourceView** ppSRV) noexcept;

 

CreateShaderResourceView ๋ทฐ๋Š” ์…ฐ์ด๋” ๋ฆฌ์†Œ์Šค๋ทฐ๋ฅผ ์ƒ์„ฑํ•จ๊ณผ ๋™์‹œ์— ๋ฆฌ์†Œ์Šค๋„ ๊ฐ™์ด ์ƒ์„ฑํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค๋ทฐ์— ํ• ๋‹น๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ๋Š” 

mSRV->GetResource((ID3D11Resource**)mTexture.GetAddressOf());

ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ทฐ์—์„œ GetResourceํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์…ฐ์ด๋”์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์…ฐ์ด๋”์— ์„ธํŒ…ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

    void GraphicsDevice_DX11::SetShaderResource(eShaderStage stage, UINT startSlot, ID3D11ShaderResourceView** ppSRV)
    {
        if ((UINT)eShaderStage::VS & (UINT)stage)
            mContext->VSSetShaderResources(startSlot, 1, ppSRV);

        if ((UINT)eShaderStage::HS & (UINT)stage)
            mContext->HSSetShaderResources(startSlot, 1, ppSRV);

        if ((UINT)eShaderStage::DS & (UINT)stage)
            mContext->DSSetShaderResources(startSlot, 1, ppSRV);

        if ((UINT)eShaderStage::GS & (UINT)stage)
            mContext->GSSetShaderResources(startSlot, 1, ppSRV);

        if ((UINT)eShaderStage::PS & (UINT)stage)
            mContext->PSSetShaderResources(startSlot, 1, ppSRV);
    }
    
// HLSL
struct VTX_OUT
{
    float4 vPos : SV_Position;
    float4 vColor : COLOR;
    float2 vUV : TEXCOORD;
};


Texture2D triangleTexture : register(t0);
SamplerState samplerState : register(s0);

float4 PS_Test(VTX_OUT _in) : SV_Target
{
    float4 color = (float) 0.0f;
    
    color = triangleTexture.Sample(samplerState, _in.vUV);
    
    return color;
}

 

ํ…์Šค์ฒ˜ ๋ฆฌ์†Œ์Šค๋Š”  ๊ธฐ๋ณธ์ ์œผ๋กœ Release ์‹œ์ผœ์ค„ ํ•„์š”๋Š” ์—†๋‹ค. (๋‹จ GetResource๋กœ ์–ป์–ด์˜จ ์ธํ„ฐํŽ˜์ด์Šค๋Š” Release ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

์ถ”๊ฐ€์ ์œผ๋กœ ๋ Œ๋”ํƒ€๊ฒŸ, CPU์—์„œ ์‚ฌ์šฉ ํ• ์ˆ˜ ์žˆ๋Š” ํ…์Šค์ฒ˜๋„ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๊ฑด ์ถ”ํ›„์— ์‚ฌ์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

๋Œ“๊ธ€