KoreanFoodie's Study

DirectX 11 2D 게임 프로그래밍 - 14. Texture 설정과 이미지 띄우기 본문

Game Dev/DirectX

DirectX 11 2D 게임 프로그래밍 - 14. Texture 설정과 이미지 띄우기

GoldGiver 2021. 11. 3. 22:06


DirectX 11 2D 게임 프로그래밍 - 14. Texture 설정과 이미지 띄우기

 

화면에 이미지 띄우기

 - ID3D11ShaderResourceView를 사용하여 텍스쳐 자원 생성

 - 텍스쳐 좌표계는 좌측 상단이 시작점이고, 0~1 범위로 정규화되어 있음

 - HLSL에서는 Texture2D 자료형으로 텍스쳐 자원을 받는다

 - 해당 픽셀이 그려낼 텍스쳐 색상을 추출하기 위해 Sample 함수를 사용한다

 

투명한 픽셀 제거하기

 - clip() 함수를 이용해 제거할 수 있다.

 - if 문과 discard 키워드를 이용해 제거할 수 있다.

 

Execute.h

먼저 헤더 파일에서 ID3D11ShaderResourceView를 만들어 준다.

struct VertexTexture
{
	D3DXVECTOR3 position;
	D3DXVECTOR2 uv; // Texture Coordinate
};

ID3D11ShaderResourceView* shader_resource = nullptr;

 

Execute.cpp

그 후, Execute.cpp에서 ShaderResourceView를 설정해 준다.

	// Create Shader Resource View
	{
		auto hr = D3DX11CreateShaderResourceViewFromFileA
		(
			graphics->GetDevice(),
			"Tree.png",
			nullptr,
			nullptr,
			&shader_resource,
			nullptr
		);
		assert(SUCCEEDED(hr));
	}

 

Texture.hlsl

그 후, Color.hlsl을 복하해 Texture.hlsl을 생성한 다음, 텍스쳐 자원을 세팅해 준다. Execute.cpp에서 연결한 Color.hlsl도 Texture.hlsl로 바꾸어 주어야 한다. 아래 코드에서 Tree.png는 사용자가 실제로 다운로드한 이미지 파일이다.

// t0 : 텍스쳐 자원이라는 의미의 t
Texture2D source_texture	: register(t0); // 원본의 픽셀 데이터가 들어가 있음
SamplerState samp			: register(s0);

// shader는 진입점을 기준으로 컴파일 하기에 하나의 파일에 PixelShaer, VertexShader 모두 작성해도 괜찮음

// 진입점 함수
// Pixel Shader : Rasterizer가 지정한 픽셀 개수만큼 호출
// Sampling : 임의의 데이터를 추출하는 것 
float4 PS(PixelInput input) : SV_Target // SV_Target[n] 시멘틱으로 현재 세팅된 메인 렌더러 타겟을 사용하라고 알려준다.
{
	float4 color = source_texture.Sample(samp, input.uv);
	
	// HLSL에 clip() 함수는 인자로 받는 데이터가 0보다 작으면 해당 데이터를 폐기한다
	// clip(color.a - 0.9f);
	
	if (color.a < 0.1f)
		discard;
	
	
	return color;
}

 


더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!

Comments