아들과 2인 개발 모음
Search
마지막 포스트 이후에 바쁜 일이 많아서 포스팅이 늦어졌습니다. 예고했던 것처럼 이번 포스팅에서는 3D 모델 위에 글씨를 쓰는 방법을 알아보려고 합니다. 큰 그림은 이렇습니다.
•
실시간으로 글씨를 조합하고, 글씨를 텍스쳐로 만든다
•
글씨 텍스쳐를 모델 위에 덧붙인다. (데칼)
글씨 텍스쳐 만들기
글씨 텍스쳐를 만드는 방법에는 크게 두 가지 방향이 있습니다. 하나는 FreeType 같은 폰트 라이브러리를 사용해서 텍스트를 바로 이미지로 렌더링하는 방법이고, 다른 하나는 3D 공간에 NGUI나 UGUI 등으로 글씨를 만든 후에 보이지 않는 카메라로 찍어서 렌더 텍스쳐로 뽑아내는 방법입니다.
제가 사용한 방법은 후자입니다. 별도의 라이브러리를 사용할 필요도 없고, 3D 공간을 원하는 대로 꾸며서 다양한 효과를 얻을 수 있기 때문입니다. 그림으로 그려보면 이렇습니다. 카메라에서 렌더 텍스쳐를 뽑은 후에는 계속해서 재활용할 수 있도록 텍스쳐로 변환하는 과정이 있습니다.
렌더 텍스쳐를 통해 글씨 텍스쳐 만들기
코드는 간단합니다. 우선 렌더 텍스쳐를 만든 후에 카메라에 세팅해줍니다.
var rt = new RenderTexture(width, height, 0, DefaultFormat.LDR);
cameraComp.targetTexture = rt;
C#
렌더 텍스쳐에 글씨가 렌더링 되면 텍스쳐로 복사해줍니다.
Texture2D tex = new Texture2D(rt.width, rt.height, TextureFormat.RGBA32, false);
RenderTexture.active = rt;
tex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
tex.Apply();
RenderTexture.active = null;
C#
쓰고 난 렌더 텍스쳐는 정리를 해줘야겠죠.
rt.Release();
C#
모델 위에 글씨 텍스쳐 덧붙이기
모델 위에 글씨 텍스쳐를 보여주는 것은 흔히 사용하는 데칼 방식을 선택했습니다. 셰이더가 기본 Albedo 맵에 추가로 데칼 텍스쳐를 받아서 블랜딩합니다. 큐브의 경우에는 글씨를 반복해서 그려주려고 별도의 UV 채널을 사용했습니다.
데칼 텍스쳐
셰이더는 이렇게 생겼습니다. UV0을 사용해서 베이스 텍스쳐를 샘플링하고, UV1로 데칼 텍스쳐를 샘플링한 후에, 데칼의 A 채널을 사용해서 선형보간(Lerp)을 합니다. 아래 스샷의 Lerp 결과 프리뷰는 무시하셔도 됩니다. 모델의 UV0, UV1이 어떻게 언랩 되었는지에 따라서 Lerp 결과는 다르겠죠?
텍스쳐 블랜딩
마치며…
내용이 너무 간단해서 도움이 되셨는지 모르겠네요.
다음 번에도 예정대로 컴포넌트 설계 방향와 게임오브젝트 관리에 관한 포스팅을 올리려고 합니다. (그 전에 리펙토링을 좀 해야될 것 같기는 하지만..) 유니티로 게임 개발을 하면서 느낀 점들을 짧게나마 공유할 수 있도록 힘써 보겠습니다.