삼각형에 텍스처, 이미지를 입히기 위해서 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);
유니티 엔진에서 사용해본 적이 용어인 '아틀라스'는 하나의 종이에 여러 텍스쳐를 붙여 그려 필요한 부분만 잘라 사용하는 느낌으로 한번의 호출로 다양한 텍스쳐를 그려 낼 수 있다.
"드로우 콜을 줄여 최적화 한다."는 말에는 이 원리가 담겨있다는 느낌을 이 문구를 보고 기억해낼 수 있었다.
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 |