이미지 파일을 정점들로 이루어진 3D Object에 입히려면 어떻게 해야 할까?

    답은 각 정점을 텍스처 위에 있는 한 픽셀에 대응시켜주면 된다.

     

    RGB, 256가지의 색을 픽셀셰이더에서 비트 수와 상관없이 통일적으로 표현하기위해

    백분율로 표현한 것과 같이 텍스처 또한 마찬가지로 백분율로 표현한다.

    텍스처의 UV좌표

    정점셰이더 Vertex Shader

    float4x4 gWorldMatrix;
    float4x4 gViewMatrix;
    float4x4 gProjectionMatrix;
    
    struct VS_INPUT 
    {
    	float4 Position : POSITION0;
       
    	// UV좌표를 정점데이터의 일부로 전달한다.
    	// TEXCOORD(texture coordinate) 시맨틱을 사용한다.
    	float2 TexCoord : TEXCOORD0;
    };
    
    // 픽셀셰이더는 정점버퍼데이터에 직접적으로 접근을 하지 못하므로
    // 픽셀셰이더에서 사용해야 할 정점데이터가 있다면 그 데이터는
    // 정점셰이더를 거쳐 픽셀셰이더에 전달되어야 한다.
    struct VS_OUTPUT 
    {
    	float4 Position : POSITION0;
    	float2 TexCoord : TEXCOORD0;
    };
    
    VS_OUTPUT vs_main( VS_INPUT Input )
    {
    	VS_OUTPUT Output;
    
    	Output.Position = mul( Input.Position, gWorldMatrix );
    	Output.Position = mul( Output.Position, gViewMatrix );
    	Output.Position = mul( Output.Position, gProjectionMatrix );
       
    	// UV좌표는 3차원 공간에 존재하는게 아니므로 아무 변환없이 전달한다.
    	Output.TexCoord = Input.TexCoord;
       
    	return( Output );
    }

     

    픽셀셰이더 Pixel Shader

    // 텍스처에서 텍셀을 구해올 때 사용하는 샘플러 데이터형
    // 텍셀(texel) : 텍스처의 최소 구성 단위
    sampler2D DiffuseSampler;
    
    struct PS_INPUT
    {
    	float2 TexCoord : TEXCOORD0;
    };
    
    // 보간기가 계산해준 UV좌표 값을 받아오기 위해 PS_INPUT형의 Input을 매개변수로 받는다.
    float4 ps_main(PS_INPUT Input) : COLOR0
    {
    	// tex2D 함수로 텍스처를 샘플링한다.(색상을 추출한다)
    	float4 albedo = tex2D(DiffuseSampler, Input.TexCoord);
    	return albedo.rgba;   
    }

     

    정점버퍼에서 올바른 UV좌표 값을 불러오도록 새 항목을 추가한다
    컴파일하면 구 모델링에 2D 텍스쳐가 입혀져 지구본이 완성되었다.
    albedo.brga; 벡터의 성분에 접근하는 스위즐swizzle을 통해 rgba의 순서를 바꾸는것도 가능하다 .

    출처 : 셰이더 프로그래밍 입문

    댓글