1. GameEngineTexture
DirectX Texture 관련 리소스를 관리하고 Texture 관련 인터페이스를 제공하는 클래스.
1-0. 멤버 변수
<hide/>
class GameEngineTexture : public GameEngineRes<GameEngineTexture>
{
private:
//텍스처 리소스
ID3D11Texture2D* Texture2D;
//리소스 뷰들
//텍스처에 접근하기 위한 렌더타겟 뷰
ID3D11RenderTargetView* RenderTargetView;
//셰이더 리소스에 접근하기 위한 리소스 뷰
ID3D11ShaderResourceView* ShaderResourceView;
//DirectTex의 변수들
DirectX::TexMetadata Metadata;
DirectX::ScratchImage Image;
};
1-1. TextureLoad
호출자 : GameEngineCore::EngineResourcesInitialize의 전역 함수 EngineTextureLoad
하는 역할 : 텍스처의 경로를 받아와 GameEngineTexture을 만든 이후 DirectX Texture을 로드하고 로드한 Data를 이용해서 ResourceView를 생성하는 함수
<hide/>
GameEngineTexture* GameEngineTexture::Load(const std::string& _Path, const std::string& _Name)
{
//먼저 빈 GameEngineTexture가 생성된다.
GameEngineTexture* NewRes = CreateResName(_Name);
//이후 _Path 경로에 있는 Texture을 로드한다.
NewRes->TextureLoad(_Path);
return NewRes;
}
void GameEngineTexture::TextureLoad(const std::string& _Path)
{
std::string Ex = GameEngineString::ToUpperReturn(GameEnginePath::GetExtension(_Path));
//현재 문자열이 멀티바이트니 유니코드로 변환한다.
std::wstring LoadPath = GameEngineString::AnsiToUnicodeReturn(_Path);
//확장자가 TGA, DDS일 경우 별도 처리한다.
if (Ex == "TGA")
// && S_OK != DirectX::LoadFromTGAFile(LoadPath.c_str(), DirectX::WIC_FLAGS_NONE, &Metadata, Image))
{
MsgBoxAssertString(_Path + "아직 처리하지 않은 이미지 포멧입니다.");
}
else if (Ex == "DDS")
// && S_OK != DirectX::LoadFromDDSFile(LoadPath.c_str(), DirectX::WIC_FLAGS_NONE, &Metadata, Image))
{
MsgBoxAssertString(_Path + "아직 처리하지 않은 이미지 포멧입니다.");
}
//텍스처를 로드하고 그 정보를 MetaData, ScartchImage에 넣는다.
else if(S_OK != DirectX::LoadFromWICFile(LoadPath.c_str(), DirectX::WIC_FLAGS_NONE, &Metadata, Image))
{
MsgBoxAssertString(_Path + "로드에 실패했습니다.");
}
//방금 얻는 ScratchImage을 이용해서 쉐이더 리소스 뷰를 생성한다.
if (S_OK != DirectX::CreateShaderResourceView(
GameEngineDevice::GetDevice(),
Image.GetImages(),
Image.GetImageCount(),
Image.GetMetadata(),
&ShaderResourceView
))
{
MsgBoxAssertString(_Path + "쉐이더 리소스 생성에 실패했습니다.");
}
}
1-2. CreateRenderTargetView
호출자 : GameEngineRenderTarget::CreateRenderTargetTexture (렌더 타겟이 만들어지고, Texture2D가 세팅된 후 호출)
하는 역할 : GameEngineTexture이 가지고 있는 Texture2D와 Bind된 RenderTargetView를 생성하고 리턴한다.
<hide/>
ID3D11RenderTargetView* GameEngineTexture::CreateRenderTargetView()
{
//이미 렌더타겟뷰가 존재한다면 그걸 리턴해준다.
if (nullptr != RenderTargetView)
{
return RenderTargetView;
}
//디바이스를 통해 렌더타겟 뷰 생성
if (S_OK != GameEngineDevice::GetDevice()->CreateRenderTargetView(Texture2D, nullptr, &RenderTargetView))
{
MsgBoxAssert("랜더타겟 생성에 실패했습니다.");
}
return RenderTargetView;
}
1-3. VSSetting && PSSetting
호출자 : GameEngineShaderResourcesHelper::ShaderCheck (파이프라인을 세팅해주고 쉐이더에 있는 리소스 정보를 받아올 때)
하는 역할 : Texture2D와 연결된 ShaderResourceView를 쉐이더의 Texture2D와 연결해 준다.
<hide/>
void GameEngineTexture::VSSetting(int _BindPoint)
{
if (nullptr == ShaderResourceView)
{
MsgBoxAssert("존재하지 않는 텍스처를 사용할 수 없습니다.");
}
GameEngineDevice::GetContext()->VSSetShaderResources(_BindPoint, 1, &ShaderResourceView);
}
void GameEngineTexture::PSSetting(int _BindPoint)
{
if (nullptr == ShaderResourceView)
{
MsgBoxAssert("존재하지 않는 텍스처를 사용할 수 없습니다.");
}
GameEngineDevice::GetContext()->PSSetShaderResources(_BindPoint, 1, &ShaderResourceView);
}
2. 텍스처 좌표
2-1. UV 좌표
매핑을 할 때 사용되는 좌표계. 좌측 상단이 0,0이고 우측 하단이 1,1이다.
텍스처와 스크린 공간의 픽셀들 둘다 UV좌표계를 가진다.
2-2. TEXCOORD
텍스처의 UV좌표계에 있는 UV좌표를 텍스처 좌표라 한다.
쉐이더는 이 텍스처 좌표를 TEXCOORD 형식으로 가지고 있다.
메쉬의 각 Vertex에 TEXCOORD값을 설정해주면, 메쉬에 의해 건저진 픽셀들은 레스터라이저 단계에서 자동으로 보간된 값을 가진다.
2-3. Sampler & Sampling
스크린 화면의 픽셀의 텍스처 좌표와 텍스처의 텍스처 좌표를 매핑시키는 작업을 Sampling이라 한다.
이 때 매핑 시키는 옵션을 Sampler
3. GameEngineSampler
DirectX의 Sampler 데이터를 보관하고 인터페이스 함수를 제공하는 클래스
3-0. 멤버 변수
<hide/>
class GameEngineSampler : public GameEngineRes<GameEngineSampler>
{
private:
ID3D11SamplerState* State;
D3D11_SAMPLER_DESC Desc;
};
3-1. Create
호출자 : ResoucesCore의 EngineTextureLoad
하는 역할 : 옵션이 세팅된 Desc로 샘플러를 생성한다.
//외부에 드러난 사용자 인터페이스 함수
GameEngineSampler* GameEngineSampler::Create(const std::string& _Name, const D3D11_SAMPLER_DESC& _Info)
{
GameEngineSampler* NewRes = CreateResName(_Name);
NewRes->Create(_Info);
return NewRes;
}
void GameEngineSampler::Create(const D3D11_SAMPLER_DESC& _Info)
{
Desc = _Info;
if (S_OK != GameEngineDevice::GetDevice()->CreateSamplerState(&_Info, &State))
{
MsgBoxAssert("존재하지 않는 텍스처를 사용할 수 없습니다.");
}
}
3-2 VSSetting & PSSetting
호출자 : GameEngineShaderResourcesHelper::ShaderCheck (파이프라인이 Set될 때)
하는 역할 : 그래픽 카드에 존재하는 Sampler를 쉐이더의 SamplerState와 연결해준다.
<hide/>
void GameEngineSampler::VSSetting(int _BindPoint)
{
if (nullptr == State)
{
MsgBoxAssert("존재하지 않는 샘플러를 사용할 수 없습니다.");
}
GameEngineDevice::GetContext()->VSSetSamplers(_BindPoint, 1, &State);
}
void GameEngineSampler::PSSetting(int _BindPoint)
{
if (nullptr == State)
{
MsgBoxAssert("존재하지 않는 샘플러를 사용할 수 없습니다.");
}
GameEngineDevice::GetContext()->PSSetSamplers(_BindPoint, 1, &State);
}
'DirectX > 공부 내용' 카테고리의 다른 글
DirectX::FrameAnimation (0) | 2022.07.15 |
---|---|
DirectX:: Atlas Texture 처리 (0) | 2022.07.14 |
C++ Functional (0) | 2022.07.12 |
렌더링 파이프 라인 : ConstantBuffer (0) | 2022.07.11 |
DirectX::동차 좌표계 (0) | 2022.07.06 |