Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
3D 텍스트
소개
프로젝트에서 HUD뿐만 아니라 3D 씬의 일부로 텍스트를 생성해야 하는 경우가 있을 수 있습니다. Godot는 이를 수행하는 2가지 방법을 제공합니다: Label3D 노드와 MeshInstance3D 노드를 위한 TextMesh *리소스*입니다.
게다가 Godot는 카메라의 3D 포인트 위치에 따라 Control 노드를 배치하는 것을 가능하게 합니다. 이는 Label3D 및 TextMesh가 충분히 유연하지 않은 상황에서 "진정한" 3D 텍스트의 대안으로 사용될 수 있습니다.
Label3D
Label3D는 Label 노드처럼 작동하지만 3D 공간에서 작동합니다. Label 노드와 달리 이 Label3D 노드는 GUI 테마의 속성을 상속하지 않습니다. 그러나 모양은 계속 사용자 정의 가능하며 Control 노드(MSDF 글꼴 렌더링 지원 포함)와 동일한 글꼴 하위 리소스를 사용합니다.
장점
Label3D는 TextMesh보다 생성 속도가 더 빠릅니다. 둘 다 캐싱 메커니즘을 사용하여 새 글리프를 한 번만 렌더링하지만 Label3D는 특히 긴 텍스트의 경우 여전히 (재)생성하는 속도가 더 빠릅니다. 이를 통해 저사양 CPU나 모바일에서 게임을 플레이하는 동안 끊김 현상을 방지할 수 있습니다.
Label3D는 비트맵 글꼴과 동적 글꼴(MSDF 또는 밉맵 포함 여부와 관계없이)을 사용할 수 있습니다. 따라서 특히 자체 교차 윤곽선이 있는 글꼴이나 컬러 글꼴(이모지)을 렌더링하는 경우 TextMesh에 비해 해당 측면에서 더 유연합니다.
더 보기
글꼴 가져오기 구성에 대한 지침은 :ref:`doc_gui_using_fonts`를 참조하세요.
제한 사항
기본적으로 Label3D는 3D 환경과의 상호 작용이 제한되어 있습니다. Shaded 플래그가 활성화된 경우 형상에 의해 가려지고 광원에 의해 조명될 수 있습니다. 그러나 Label3D의 GeometryInstance3D 속성에서 **Cast Shadow**가 **On**으로 설정된 경우에도 그림자를 투사하지 않습니다. 이는 노드가 내부적으로 투명한 텍스처를 사용하여 쿼드 메시(쿼드당 하나의 글리프)를 생성하고 Sprite3D와 동일한 제한 사항을 갖기 때문입니다. 여러 Label3D가 겹칠 때, 특히 윤곽선이 있는 경우 투명도 정렬 문제가 명백해질 수도 있습니다.
이는 덜 부드러운 텍스트 렌더링을 희생하면서 Label3D의 투명도 모드를 알파 컷**으로 설정하여 완화할 수 있습니다. **불투명 사전 통과 투명도 모드는 Label3D가 그림자를 투사하도록 허용하면서 텍스트 부드러움을 유지할 수 있지만 일부 투명도 정렬 문제는 남아 있습니다.
자세한 내용은 3D 렌더링 제한 사항 페이지의 투명도 정렬 섹션을 참조하세요.
Label3D를 멀리서 볼 때도 텍스트 렌더링 품질이 저하될 수 있습니다. 텍스트 렌더링 품질을 향상하려면 :ref:`글꼴에서 밉맵을 활성화 <doc_using_fonts_mipmaps>`하거나 :ref:`MSDF 렌더링을 사용하도록 글꼴을 전환 <doc_using_fonts_msdf>`하세요.
고급 단계
TextMesh 리소스는 Label3D와 유사합니다. 둘 다 3D 씬로 텍스트를 표시하고 동일한 글꼴 하위 리소스를 사용합니다. 그러나 투명한 쿼드를 생성하는 대신 TextMesh는 글리프의 윤곽을 나타내고 메시 속성을 갖는 3D 형상을 생성합니다. 결과적으로 TextMesh는 기본적으로 음영처리되고 자동으로 환경에 그림자를 투사합니다. TextMesh에는 재질이 적용될 수도 있습니다(사용자 정의 셰이더 포함).
다음은 텍스처의 예와 텍스처가 메시에 적용되는 방법입니다. 생성된 메시의 UV 맵에 대한 참조로 아래 텍스처를 사용할 수 있습니다.
장점
TextMesh는 Label3D에 비해 몇 가지 장점이 있습니다.
TextMesh는 텍스처를 사용하여 면별로 텍스트 색상을 수정할 수 있습니다.
TextMesh 형상은 실제 깊이를 가질 수 있어 문자 모양에 3D 모양을 제공합니다.
TextMesh는 Label3D와 달리 사용자 정의 셰이더를 사용할 수 있습니다.
제한 사항
적어 놓을 만한 사항들이 있습니다:
Label3D와 달리 기본 제공 개요 지원이 없습니다. 하지만 이는 사용자 정의 셰이더를 사용하여 시뮬레이션할 수 있습니다.
동적 글꼴만 지원됩니다(
.ttf,.otf,.woff,.woff2)..fnt또는.font형식의 비트맵 글꼴은 지원되지 않습니다.자체 교차하는 윤곽선이 있는 글꼴은 올바르게 렌더링되지 않습니다. Google Fonts와 같은 웹사이트에서 다운로드한 글꼴에 렌더링 문제가 있는 경우 대신 글꼴 작성자의 공식 웹사이트에서 글꼴을 다운로드해 보세요.
텍스트 렌더링을 앤티앨리어싱하려면 MSAA, FXAA 및 TAA(시간적 앤티앨리어싱)와 같은 전체 씬 앤티앨리어싱 방법을 활성화해야 합니다. 앤티앨리어싱 방법을 활성화하지 않으면 특히 멀리서 텍스트가 거칠게 나타납니다. 자세한 내용은 :ref:`doc_3d_antialiasing`를 참조하세요.
투영된 라벨 노드(또는 기타 컨트롤)
설정이 더 복잡하지만 가장 뛰어난 유연성을 제공하는 마지막 솔루션이 있습니다. 바로 2D 노드를 3D 공간에 투영하는 것입니다. 이는 스크립트의 _process() 함수에서 Camera3D 노드의 unproject_position 메서드 반환 값을 사용하여 달성할 수 있습니다. 그런 다음 이 반환 값을 사용하여 컨트롤 노드의 position 속성을 설정해야 합니다.
이 문서 외에 여러가지 Godot 데모 프로젝트들도 살펴보면 좋습니다.
장점
Label, RichTextLabel 또는 Button과 같은 노드를 포함하여 모든 컨트롤 노드를 사용할 수 있습니다. 이를 통해 강력한 형식 지정 및 GUI 상호 작용이 가능합니다.
스크립트 기반 접근 방식을 사용하면 위치 지정이 완전히 자유로워집니다. 예를 들어, 이렇게 하면 컨트롤이 화면 밖으로 나갈 때 컨트롤을 화면 가장자리에 고정하는 것이 상당히 쉬워집니다(게임 내 3D 마커의 경우).
제어 테마가 준수됩니다. 이를 통해 프로젝트에 전역적으로 적용되는 사용자 정의가 더 쉬워집니다.
제한 사항
투영된 컨트롤은 어떤 방식으로든 3D 형상으로 가려질 수 없습니다. 목표 위치가 충돌체에 의해 가려진 경우 RayCast를 사용하여 컨트롤을 완전히 숨길 수 있지만 벽 뒤에 컨트롤을 부분적으로 숨길 수는 없습니다.
컨트롤의
scale속성을 조정하여 거리에 따라 텍스트 크기를 변경하는 것이 가능하지만 수동으로 수행해야 합니다. Label3D 및 TextMesh는 유연성이 떨어지더라도 이를 자동으로 처리합니다(최소/최대 텍스트 크기를 픽셀 단위로 설정할 수 없음).스크립트에서는 해상도 및 종횡비 변경 처리를 고려해야 하는데 이는 어려울 수 있습니다.
Label3D, TextMesh 또는 투영된 컨트롤을 사용해야 합니까?
대부분의 시나리오에서 Label3D는 설정이 더 쉽고 더 높은 렌더링 품질을 제공하므로 권장됩니다(특히 3D 앤티앨리어싱이 비활성화된 경우).
고급 사용 사례의 경우 TextMesh는 사용자 정의 셰이더로 텍스트 스타일을 지정할 수 있으므로 더욱 유연합니다. 사용자 정의 셰이더를 사용하면 표면을 따라 텍스트를 구부리는 등 최종 형상을 수정할 수 있습니다. 텍스트는 실제 3D 형상이므로 선택적으로 텍스트에 깊이를 부여할 수 있으며 전역 조명에도 기여할 수 있습니다.
BBCode 또는 제어 테마 지원과 같은 기능이 필요한 경우 투영된 RichTextLabel 노드를 사용하는 것이 유일한 방법입니다.