- UV 좌표는 텍스처 이미지 상에서 특정 지점을 나타내는 2D 좌표입니다.
- 텍스처 이미지의 가로 및 세로 축에서의 상대적인 위치를 나타냅니다.
다음 그림과 같이 UV 좌표는 모델의 각 정점에 연결되어 해당 정점이 텍스처의 어느 부분에 매핑되는지를 결정하게 됩니다.
UV좌표를 사용하여 위와 같은 사각형 뿐만 아니라, 복잡한 형태의 Model에도 각 정점에 특정 좌표를 연관지어 텍스처를 모델에 적용할 수 있습니다.
- Texture는 이미지나 그림을 나타내는 데이터로 UV좌표를 사용해 특정 모형에 부착시키는 형식으로 적용이 가능합니다.
- DirectXTex 라이브러리 사용해 텍스쳐를 불러오는 실습을 진행하였습니다.
struct Vertex
{
// 위치 좌표 (x, y, z)
Vec3 position;
// 텍스처 좌표 (u, v)
Vec2 uv;
};
// Vertex Data
{
// 사이즈 조정
_vertices.resize(4);
// 위치 정보와 uv 좌표를 설정합니다.
_vertices[0].position = Vec3(-0.5f, -0.5f, 0.0f);
_vertices[0].uv = Vec2(0.0f, 1.0f);
_vertices[1].position = Vec3(-0.5f, 0.5f, 0.0f);
_vertices[1].uv = Vec2(0.0f, 0.0f);
_vertices[2].position = Vec3(0.5f, -0.5f, 0.0f);
_vertices[2].uv = Vec2(1.0f, 1.0f);
_vertices[3].position = Vec3(0.5f, 0.5f, 0.0f);
_vertices[3].uv = Vec2(1.0f, 0.0f);
}
DirectX::TexMetadata md;
DirectX::ScratchImage img;
// 이미지를 불러옵니다. (DirectXTex 라이브러리 사용)
HRESULT hr = ::LoadFromWICFile(L"test.png", WIC_FLAGS_NONE, &md, img);
CHECK(hr);
// SRV를 생성합니다.
hr = ::CreateShaderResourceView(_device.Get(), img.GetImages(), img.GetImageCount(), md, _shaderResourceView.GetAddressOf());
CHECK(hr);
// 디바이스 컨텍스트를 이용해 PS에 만든 셰이더 리소스 뷰를 연결시켜줍니다.
_deviceContext->PSSetShaderResources(0, 1, _shaderResourceView.GetAddressOf());
// t0 레지스터에 texture0을 등록합니다.
Texture2D texture0 : register(t0);
// s0 레지스터에 sampler0을 등록합니다.
SamplerState sampler0 : register(s0);
// PixelShader의 메인 함수를 정의합니다.
// * (VS_OUTPUT input) : VS 단계에서 리턴해준 output을 입력 파라미터로 전달 받습니다.
// * SV_Target : PS의 결과물이 SV_Target(렌더 타겟)에 전달합니다.
float4 PS(VS_OUTPUT input) : SV_Target
{
// texture0번의 uv좌표에 해당하는 색상 정보를 저장합니다.
float4 color = texture0.Sample(sampler0, input.uv);
// uv좌표에 해당하는 색상 정보를 반환합니다.
return color;
}
- UV좌표 : UV 좌표는 텍스처 이미지 상에서 특정 지점을 나타내는 2D 좌표
- 이미지 출력 순서
- 텍스쳐를 사용하기 위한 기본 Mesh에 UV좌표 매핑하기
- 텍스쳐(texture) 파일을 먼저 로드해 CPU 메모리에 들고 있기
- 텍스쳐를 묘사하는 SRV를 만들어 GPU에 전달하기