곰바닥
코딩공방
곰바닥
전체 방문자
오늘
어제
  • 분류 전체보기 (28)
    • 유니티 (1)
    • DirectX (14)
      • 던파 모작 개발일지 (7)
      • 공부 내용 (7)
    • 언리얼 (13)
      • 엔진 공부 (5)
      • 이득우 네트워크 멀티플레이 (8)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 고
  • 유니티
  • directx
  • 개발 일지
  • 개발일지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
곰바닥

코딩공방

DirectX::GameEngineTexture & GameEngineSampler
DirectX/공부 내용

DirectX::GameEngineTexture & GameEngineSampler

2022. 7. 12. 19:10

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. 텍스처 좌표

참고 : http://telnet.or.kr/directx/graphics/programmingguide/fixedfunction/textures/coordinates/texturecoordinates.htm

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
    'DirectX/공부 내용' 카테고리의 다른 글
    • DirectX::FrameAnimation
    • DirectX:: Atlas Texture 처리
    • C++ Functional
    • 렌더링 파이프 라인 : ConstantBuffer
    곰바닥
    곰바닥

    티스토리툴바