컴퓨터 그래픽스/HLSL

텍스쳐매핑

YoonJongSeok 2023. 4. 29. 21:50

3D 물체를 이루는 구성요소는 삼각형이다. 이 삼각형에 fragment shader로 색을 표현할수도 있지만 텍스쳐를 이용하여 더욱 쉽게 삼각형을 표현할 수 있게 된다.

이것은 바나나의 텍스쳐이다.  object의 위치에 텍스쳐를 mapping 해주면서 넣어주게 된다. 텍스쳐는 기본적으로 tiling을 이용하는데 (0, 0) ~ (1,1)까지 값은 전체 텍스쳐 하나를 나타낸다. 그런데 이 값을 조절해주면 텍스쳐가 해당 값에 따라 반복되게 된다.

저번의 input을 받아온 것처럼 texture도 받아와야한다.

struct VS_INPUT 
{
   float4 mPosition : POSITION;
   float2 mTexCoord : TEXCOORD0;
   
};

TEXCOORD0 이 받아서 mTexCoord에 저장하게 된다. 0을 넣은 것은 여러 개의 텍스쳐를 다룰 수 있기 때문이다.

uv 좌표계에서 어떻게 2d에서 3d로 옮길까 생각해보면 정점 데이터가 들어오고 해당 정점 데이터가 texture에서는 어디에 위치할지를 구하는 것이다. 이것을 uv mapping이라고 한다.

uv mapping은 여러 방법이 있는데 기본적으로 너무 찾기에 computing에 무리가 가기 때문에 미리 위치를 지정해주어서 가져다가 붙이는 방식으로 진행한다.

그리고 interpolation을 통해 삼각형이 만들어질 것이다.

이것은 texture을 그대로 가져다가 쓰기 때문에 색에 대한 interpolation은 신경을 쓸 필요가 없다.

 

struct VS_OUTPUT 
{
   float4 mPosition : POSITION;
   float2 mTexCoord : TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;

   Output.mPosition = mul( Input.mPosition, gWorldMatrix );
   Output.mPosition = mul( Output.mPosition, gViewMatrix );
   Output.mPosition = mul( Output.mPosition, gProjectionMatrix );
   
   Output.mTexCoord = Input.mTexCoord;
   
   return Output;
   
}

 

uv의 좌표에 대한 정보가 있으니 이제 texture의 텍셀 정보를 얻어와야한다. 텍셀은 pixel이 화면의 기본 단위인 것처럼 texture의 기본 단위이다. 이것은 sampler2D DiffuseSampler를 통해 가져오고 tex2D함수를 통해 해당 uv좌표의 위치에 있는 sampler의 색을 가져오게 된다.

 

sampler2D DiffuseSampler;

struct PS_INPUT
{
   float2 mTexCoord : TEXCOORD0;
};
float4 ps_main(PS_INPUT Input) : COLOR
{   
   float4 albedo = tex2D(DiffuseSampler, Input.mTexCoord);
   return albedo.rgba;
}