오늘은 포프님의 셰이더 입문 강좌를 따라 랜더몽키를 이용하여 텍스처 맵핑하는 쉐이더 프로그래밍을 공부해 보았습니다. 이번에도 마찬가지로 랜더몽키가 기본적으로 작성해 주는 코드를 다 지우고 직접 프로그래밍을 해보았습니다.
1. 텍스처 좌표 UV
3D그래픽에서 텍스처맵핑은 정점이루어진 삼각형에 이미지 파일을 입히는 것을 말합니다. 그 이미지를 텍스처라고 합니다. 텍스처는 각 정점에 맵핑되는 좌표를 가지고 있는데 이를 텍스처 좌표라 하며 U,V로 나타냅니다. 좌 상단 기준으로 0,0 그리고 우하단 기준 1,1로 0~1까지의 상대적인 값으로 나타냅니다.
아래 그림과 같이 0.5를 v1에 맵핑한다면 이미지의 절반만 매핑되게 됩니다. 또 2를 v1에 맵핑하게 된다면 이미지가 두번씩 나타나게 되어있습니다.
2. 랜더몽키 초기 설정
우선 텍스처 맵핑 쉐이더프로그래밍에 앞서 지난번 빨강쉐이더 처럼 쉐이더 코드를 다 지우고, view, world, projection 메트릭스를 추가 해 주었습니다.
또 텍스처 이미지를 추가 해줍니다. (Add Texture > Add 2d Texture > 이미지선택)
그럼 우측처럼 workspace에 Earth가 추가 된 것을 볼 수 있습니다. 이것을 DiffuseMap이라고 변경합니다.
그리고 Pass0에서 Texture객체를 추가해 줍니다.
이 텍스처 객체의 이름을 DiffuseSampler로 변경합니다.
3. 텍스처맵핑 정점쉐이더 작성
이제 Vertex Shader에 정점 쉐이더를 작성해 줍니다.
struct VS_INPUT{
float4 mPosition:POSITION;
float2 mTexCoord:TEXCOORD0;
};
struct VS_OUTPUT{
float4 mPosition:POSITION;
float2 mTexCoord: TEXCOORD0;
};
float4x4 gViewMatrix;
float4x4 gWorldMatrix;
float4x4 gProjectionMatrix;
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;
}
빨강쉐이더의 정점쉐이더와 다른점은 정점 구조체에 mTextCoord:TEXCOORD0라는 텍스처 좌표가 들어갔다는 것 입니다. float2로 선언 된것으로 보아 U,V좌표임을 알 수 있습니다. 각 정점마다 정점에 맵핑되는 텍스처의 좌표를 갖고있는 것을 표현하고 있다고 볼 수 있습니다.
참고로 TEXCOORD는 텍스처의 시멘틱이며 0는 0번째 텍스처 좌표라는 시멘틱입니다. 텍스처 좌표는 그대로 output으로 리턴됩니다.
4. 픽셀 쉐이더 작성
sampler2D DiffuseSampler;
struct PS_INPUT
{
float2 mTexCoord : TEXCOORD0;
};
float4 ps_main(PS_INPUT Input) : COLOR
{
float4 albedo = tex2D(DiffuseSampler, Input.mTexCoord);
return albedo.rgba;
}
위와 같이 전역변수인 sampler2D에 텍스처 오브젝트를 바인딩 해줍니다. sampler2D는 2D텍스처에서 텍셀 하나를 구해오는데 사용된다고 합니다. tex2D함수는 텍스처 샘플러에서 주어진 UV 좌표에 해당하는 텍셀의 값을 리턴합니다.
5. UV좌표 맵핑
현재 VS_INPUT과 VS_OUTPUT에는 정점좌표와 mPosition과 mTexCoord이라는 텍스처 좌표가 있습니다. 때문에 입력값에 텍스처 좌표도 추가 시켜줘야 합니다. 아래 그림과 같이 Stream Mapping을 더블클릭하여 보면 Stream Mapping 창이 뜹니다.
여기서 Add를 눌러 아래와 같이 TEXCOORD를 추가해줍니다.
6. 랜더링
F5를 눌러 프리뷰 창을 확인해봅니다. 동그란 구에 지구이미지가 입혀진 것을 볼 수 있습니다.
참고
'ComputerGraphics > HLSL' 카테고리의 다른 글
쉐이더프로그래밍 / 디퓨즈 스페큘러 맵핑 (0) | 2020.06.24 |
---|---|
정반사 (Phong model) HLSL 구현 / 렌더몽키(RenderMonkey) (0) | 2020.06.01 |
난반사 HLSL (람베르트 반사) 쉐이더 / 렌더몽키(RenderMonkey) (0) | 2020.05.28 |
쉐이더프로그래밍 / 빨강 쉐이더 만들기 (렌더몽키) (1) | 2020.05.16 |
쉐이더프로그래밍 / 렌더몽키 RenderMonkey를 설치해보자 (0) | 2020.05.16 |
댓글