텍스처는 다른 자원과 마찬가지로 렌더링 파이프라인에서 [뷰]를 통해 엑세스 된다.
[뷰]는 [텍스처 리소스]가 렌더링 파이프라인으로부터 어떠한 데이터로 보이게 할것인가를 정의한다.
텍스처를 다루는 기본적인 순서는
텍스처 리소스 생성 -> 텍스처 이미지 로드 -> 텍스처에 엑세스 하는 뷰 생성
우리는 이미지로드를 하기 위해서 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;
};
}
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 Texture::Bind(eShaderStage stage, UINT startSlot)
{
graphics::GetDevice()->SetShaderResource(stage, startSlot, mSRV.GetAddressOf());
}