상세 컨텐츠

본문 제목

Texture(1) - UV 좌표

DirectX

by 부레두 2024. 7. 8. 18:06

본문

좌표의 특징

삼각형에 텍스처, 이미지를 입히기 위해서 Direct3D는 'u'축이 가로, 'v'축이 세로 방향인 텍스처 좌표계를 사용한다.

'텍셀'이라고도 부르는 이 좌표계는 0 ≤ u, v ≤ 1 로 보통의 좌표계와 달리 DirectX에선 위에서 아래로 향한다.

 

[0, 1]로 정규화된 좌표계를 사용하는 이유는 이미지가 크던, 작던 영향을 받지 않고 사용하기 위함으로 UV 좌표 (0.25, 0.75) 가 나타내는 뜻은 이미지 크기의 가로 1/4와 세로 3/4에 위치하는 점이다.

물론 1의 범위를 넘어가는 경우도 존재하고 이를 처리하는 방법도 따로 존재한다.

 

텍스처 생성 및 적용

삼각형, Direct3D에 입력한 정점 좌표에 UV좌표를 추가하기 위해선 기존에 입력했던 x, y, z 정점 좌표에 2차원 좌표를 추가해 입력해주고 ' D3DX11CreateShaderResourceViewFromFile ' 라는 Texture2D 객체 생성, 쉐이더 자원 뷰 생성의 2가지 과정을 한꺼번에 해주는 함수를 통해 사용한다.

// 정점 정보에 uv 좌표 값을 추가
struct VertexTexture
{
	VertexTexture()
		: Position(0, 0, 0)
		, Uv(0, 0) {}

	Vector3	Position;
	Vector2	Uv;
};

// 정점이 uv 좌표상 위치를 지정
vertices[0].Uv = Vector2(0, 1);
vertices[1].Uv = Vector2(0, 0);
vertices[2].Uv = Vector2(1, 1);
vertices[3].Uv = Vector2(1, 0);

// 텍스쳐와 렌더뷰를 생성
Check(D3DX11CreateShaderResourceViewFromFile
(
	D3D::GetDevice(), L"../../_Textures/Box.png", NULL, NULL, &srv, NULL
));

 

이렇게 텍스처를 만들었다면 PS안에서 텍스처에 접근할수 있도록 Textrue2D 객체를 만들어 fx 파일 바깥에서 얻어야한다.

// .fx 파일 안 PS에서 texture2D에 대한 연산을 지정
texture2D Map;

float4 PS(VertexOutput input) : SV_Target
{
    return Map.Sample(Samp, input.Uv);
}

// .cpp 에서 Shader 파일에 생성한 texture2D 객체에 대한 포인터를 C++ 인터페이스를 통해 연결
shader->GetVariableByName("Map")->SetResource(srv);

출력 예시

텍스쳐 아틀라스( 대지도 )

유니티 엔진에서 사용해본 적이 용어인 '아틀라스'는 하나의 종이에 여러 텍스쳐를 붙여 그려 필요한 부분만 잘라 사용하는 느낌으로 한번의 호출로 다양한 텍스쳐를 그려 낼 수 있다.

"드로우 콜을 줄여 최적화 한다."는 말에는 이 원리가 담겨있다는 느낌을 이 문구를 보고 기억해낼 수 있었다.

텍스쳐 아틀라스의 예시

 

'DirectX' 카테고리의 다른 글

Texture(3) - 좌표지정모드  (0) 2024.07.11
Texture(2) - 필터, 확대와 축소  (1) 2024.07.08
Grid 그리기  (0) 2024.06.24
정점, 인덱스를 이용한 렌더링  (0) 2024.06.19
벡터 대수  (0) 2024.06.08

관련글 더보기