Search
Duplicate

텍스처(Texture) - DirectXTex lib

텍스처는 다른 자원과 마찬가지로 렌더링 파이프라인에서 [뷰]를 통해 엑세스 된다.
[뷰]는 [텍스처 리소스]가 렌더링 파이프라인으로부터 어떠한 데이터로 보이게 할것인가를 정의한다.
텍스처를 다루는 기본적인 순서는
텍스처 리소스 생성 -> 텍스처 이미지 로드 -> 텍스처에 엑세스 하는 뷰 생성
우리는 이미지로드를 하기 위해서 DirectX에서 제공되는 로드함수대신에 DirectXTex라는 이미지 로드 라이브러리를 사용한다. png, bmp, jpg등등 다양한 이미지 확장자 로드를 제공해주는 라이브러리 이다.
#pragma once #include <DirectXTex.h> #include <DirectXTex.inl> #include <DirectXTexEXR.h> #include "yaResource.h" #include "yaGraphicDevice_DX11.h" namespace ya::graphics { class Texture : public Resource { public: Texture(); ~Texture(); virtual HRESULT Save(const std::wstring& path) override; virtual HRESULT Load(const std::wstring& path) override; void Bind(eShaderStage stage, UINT startSlot); //std::wstring private: ScratchImage mImage; D3D11_TEXTURE2D_DESC mDesc; Microsoft::WRL::ComPtr<ID3D11Texture2D> mTexture; Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> mSRV; Microsoft::WRL::ComPtr<ID3D11RenderTargetView> mRTV; }; }
C++
복사
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;
C++
복사
CreateShaderResourceView 뷰는 셰이더 리소스뷰를 생성함과 동시에 리소스도 같이 생성한다.
리소스뷰에 할당된 리소스를 가져올때는
mSRV->GetResource((ID3D11Resource**)mTexture.GetAddressOf());
C++
복사
해당 리소스뷰에서 GetResource함수를 통해서 리소스를 가져올수 있다.
해당 리소스를 셰이더에서 사용하려면 파이프라인에에 세팅해주어야 한다.
void Texture::Bind(eShaderStage stage, UINT startSlot) { graphics::GetDevice()->SetShaderResource(stage, startSlot, mSRV.GetAddressOf()); }
C++
복사
파이프라인 슬롯에 맞게 세팅해주었다면 hlsl 에서 해당 레지스터 번호에 맞게 데이터가 세팅(바인딩) 될것이다.
Texture2D albedo : register(t0); SamplerState defaultSampler : register(s0); struct VS_Input { float3 pos : POSITION; float4 color : COLOR; float2 uv : TEXCOORD; }; struct VS_Output { float4 pos : SV_Position; float4 color : COLOR; float2 uv : TEXCOORD; }; float4 main(VS_Output input) : SV_Target { float4 color = albedo.Sample(defaultSampler, input.uv); return color; }
C#
복사
텍스처 리소스는 기본적으로 Release 시켜줄 필요는 없다. (단 GetResource로 얻어온 인터페이스는 Release 시켜주어야 한다.
추가적으로 렌더타겟, CPU에서 사용 할수 있는 텍스처도 생성이 가능하다. 이건 추후에 사용해보도록 하겠다.