텍스처는 다른 자원과 마찬가지로 렌더링 파이프라인에서 [뷰]를 통해 엑세스 된다.
[뷰]는 [텍스처 리소스]가 렌더링 파이프라인으로부터 어떠한 데이터로 보이게 할것인가를 정의한다.
텍스처를 다루는 기본적인 순서는
텍스처 리소스 생성 -> 텍스처 이미지 로드 -> 텍스처에 엑세스 하는 뷰 생성
우리는 이미지로드를 하기 위해서 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에서 사용 할수 있는 텍스처도 생성이 가능하다. 이건 추후에 사용해보도록 하겠다.