텍스처는 다른 자원과 마찬가지로 렌더링 파이프라인에서 [뷰]를 통해 엑세스 된다.

[뷰]는 [텍스처 리소스]가 렌더링 파이프라인으로부터 어떠한 데이터로 보이게 할것인가를 정의한다.

Untitled

텍스처를 다루는 기본적인 순서는

텍스처 리소스 생성 -> 텍스처 이미지 로드 -> 텍스처에 엑세스 하는 뷰 생성

우리는 이미지로드를 하기 위해서 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());
	}