🎨DirectX
[DX] UV 좌표계 (Texture 출력)
공대 컴린이
2023. 2. 4. 22:30
728x90
📚 UV 좌표계 (2D)
- 가로로 가는 좌표 : U
- 세로로 가는 좌표 : V
![]() |
![]() |
기존 좌표계 | UV 좌표계 |
DirectX에서 Texture를 출력하기 위해서 유용하게 사용되는 것이 UV 좌표계이다.
UV좌표는 비율이다.
정점에서 다른 정점까지의 거리 비율이기 때문에 항상 0~1값을 가진다. 즉, Normalize 되었다고 볼 수있다.
색상값(RGB)은 256이기 때문에 (0~255) 값을 사용한다.
근데 그래픽 프로그래밍에서는 색상값도 비율로 계산해서 255값으로 나눈 Blue(0, 0, 1) 값을 사용한다.
(0~1값으로 변환하면서 조금은 수치가 달라지긴 하는데 게임 만들때 엄청나게 정확한 소수점 수치까지 다 필요한경우는 거의 없어서 신경쓰지 않는다)
또한 UV좌표는 2D여서 z축이 존재하지 않는다. 따라서 UV 좌표를 사용할 때는 기존 Position값(Vector3)과 달리 Vector2 자료형을 사용한다.
UV 좌표계를 배우기 전 정점을 정의하는 쉐이더 코드에서는 Vector3 Position 위치값만 선언하였는데,
이제는 Vector2 Uv로 구성된 UV 좌표계를 추가하여 구현하는것이 좋다.
지금까지 정점의 정의를 Vertex라고 하였는데 Uv 좌표값을 포함하여 VertexTexture로 정의한 자료형을 사용할 것이다.
📄 Texture.fx (Shader Code)
matrix World;
matrix View;
matrix Projection;
Texture2D Map;
struct VertexInput
{
float4 Position : Position;
float2 Uv : Uv;
};
struct VertexOutput
{
float4 Position : SV_Position;
float2 Uv : Uv;
};
VertexOutput VS(VertexInput input)
{
VertexOutput output;
output.Position = mul(input.Position, World);
output.Position = mul(output.Position, View);
output.Position = mul(output.Position, Projection);
output.Uv = input.Uv;
return output;
}
SamplerState Samp;
float4 PS(VertexOutput input) : SV_Target
{
return Map.Sample(Samp, input.Uv);
}
// 출력 결과를 선분으로 구성된 프레임으로 출력
RasterizerState FillMode_Wireframe
{
FillMode = Wireframe;
};
technique11 T0
{
pass P0
{
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS()));
}
pass P1
{
SetRasterizerState(FillMode_Wireframe);
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS()));
}
}
[ 출력 결과 ]
728x90