이미지 파일을 정점들로 이루어진 3D Object에 입히려면 어떻게 해야 할까?
답은 각 정점을 텍스처 위에 있는 한 픽셀에 대응시켜주면 된다.
RGB, 256가지의 색을 픽셀셰이더에서 비트 수와 상관없이 통일적으로 표현하기위해
백분율로 표현한 것과 같이 텍스처 또한 마찬가지로 백분율로 표현한다.
정점셰이더 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;
}
출처 : 셰이더 프로그래밍 입문
'Shader & 포스트 프로세싱' 카테고리의 다른 글
디퓨즈/스페큘러 매핑 (0) | 2022.02.23 |
---|---|
기초적인 조명셰이더(2)_정반사광specular light (0) | 2022.02.23 |
기초적인 조명셰이더(1)_난반사광diffuse light (0) | 2022.02.22 |
빨강셰이더 (0) | 2022.02.15 |
Shader란? (0) | 2022.02.14 |
댓글