3d_text.rst 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. .. _doc_3d_text:
  2. 3D text
  3. =======
  4. Introduction
  5. ------------
  6. In a project, there may be times when text needs to be created as part of a 3D
  7. scene and not just in the HUD. Godot provides 2 methods to do this: the
  8. Label3D node and the TextMesh *resource* for a MeshInstance3D node.
  9. Additionally, Godot makes it possible to position Control nodes according to a
  10. 3D point's position on the camera. This can be used as an alternative to "true"
  11. 3D text in situations where Label3D and TextMesh aren't flexible enough.
  12. .. seealso::
  13. You can see 3D text in action using the
  14. `3D Labels and Texts demo project <https://github.com/godotengine/godot-demo-projects/tree/master/3d/labels_and_texts>`__.
  15. This page does **not** cover how to display a GUI scene within a 3D
  16. environment. For information on how to achieve that, see the
  17. `GUI in 3D <https://github.com/godotengine/godot-demo-projects/tree/master/viewport/gui_in_3d>`__
  18. demo project.
  19. Label3D
  20. -------
  21. .. image:: img/label_3d.png
  22. Label3D behaves like a Label node, but in 3D space. Unlike the Label node, this
  23. Label3D node does **not** inherit properties of a GUI theme. However, its look
  24. remains customizable and uses the same font subresource as Control nodes
  25. (including support for :abbr:`MSDF (Multi-channel Signed Distance Font)` font
  26. rendering).
  27. Advantages
  28. ^^^^^^^^^^
  29. - Label3D is faster to generate than TextMesh. While both use a caching
  30. mechanism to only render new glyphs once, Label3D will still be faster to
  31. (re)generate, especially for long text. This can avoid stuttering during
  32. gameplay on low-end CPUs or mobile.
  33. - Label3D can use bitmap fonts and dynamic fonts (with and without
  34. :abbr:`MSDF (Multi-channel Signed Distance Font)` or mipmaps). This makes it
  35. more flexible on that aspect compared to TextMesh, especially for rendering
  36. fonts with self-intersecting outlines or colored fonts (emoji).
  37. .. seealso::
  38. See :ref:`doc_gui_using_fonts` for guidelines on configuring font imports.
  39. Limitations
  40. ^^^^^^^^^^^
  41. By default, Label3D has limited interaction with a 3D environment. It can be
  42. occluded by geometry and lit by light sources if the **Shaded** flag is enabled.
  43. However, it will not cast shadows even if **Cast Shadow** is set to **On** in
  44. the Label3D's GeometryInstance3D properties. This is because the node internally
  45. generates a quad mesh (one glyph per quad) with transparent textures and has the
  46. same limitations as Sprite3D. Transparency sorting issues can also become apparent
  47. when several Label3Ds overlap, especially if they have outlines.
  48. This can be mitigated by setting the Label3D's transparency mode to **Alpha
  49. Cut**, at the cost of less smooth text rendering. The **Opaque Pre-Pass**
  50. transparency mode can preserve text smoothness while allowing the Label3D to
  51. cast shadows, but some transparency sorting issues will remain.
  52. See :ref:`Transparency sorting <doc_3d_rendering_limitations_transparency_sorting>`
  53. section in the 3D rendering limitations page for more information.
  54. Text rendering quality can also suffer when the Label3D is viewed at a distance. To improve
  55. text rendering quality, :ref:`enable mipmaps on the font <doc_using_fonts_mipmaps>` or
  56. :ref:`switch the font to use MSDF rendering <doc_using_fonts_msdf>`.
  57. TextMesh
  58. --------
  59. .. image:: img/text_mesh.png
  60. The TextMesh resource has similarities to Label3D. They both display text in a
  61. 3D scene, and will use the same font subresource. However, instead of generating
  62. transparent quads, TextMesh generates 3D geometry that represents the glyphs'
  63. contours and has the properties of a mesh. As a result, a TextMesh is shaded by
  64. default and automatically casts shadows onto the environment. A TextMesh can
  65. also have a material applied to it (including custom shaders).
  66. Here is an example of a texture and how it's applied to the mesh. You can use
  67. the texture below as a reference for the generated mesh's UV map:
  68. .. image:: img/text_mesh_texture.png
  69. .. image:: img/text_mesh_textured.png
  70. Advantages
  71. ^^^^^^^^^^
  72. TextMesh has a few advantages over Label3D:
  73. - TextMesh can use a texture to modify text color on a per-side basis.
  74. - TextMesh geometry can have actual depth to it, giving glyphs a 3D look.
  75. - TextMesh can use custom shaders, unlike Label3D.
  76. Limitations
  77. ^^^^^^^^^^^
  78. There are some limitations to TextMesh:
  79. - No built-in outline support, unlike Label3D. This can be simulated using custom
  80. shaders though.
  81. - Only dynamic fonts are supported (``.ttf``, ``.otf``, ``.woff``, ``.woff2``).
  82. Bitmap fonts in the ``.fnt`` or ``.font`` formats are **not** supported.
  83. - Fonts with self-intersecting outlines will not render correctly.
  84. If you notice rendering issues on fonts downloaded from websites such as
  85. Google Fonts, try downloading the font from the font author's official
  86. website instead.
  87. - Antialiasing the text rendering requires a full-scene antialiasing method to
  88. be enabled such as MSAA, FXAA and temporal antialiasing (TAA). If no
  89. antialiasing method is enabled, text will appear grainy, especially at a
  90. distance. See :ref:`doc_3d_antialiasing` for more information.
  91. Projected Label node (or any other Control)
  92. -------------------------------------------
  93. There is a last solution that is more complex to set up, but provides the most
  94. flexibility: projecting a 2D node onto 3D space. This can be achieved using the
  95. return value of :ref:`unproject_position<class_Camera3D_method_unproject_position>`
  96. method on a Camera3D node in a script's ``_process()`` function. This return value
  97. should then be used to set the ``position`` property of a Control node.
  98. See the `3D waypoints <https://github.com/godotengine/godot-demo-projects/tree/master/3d/waypoints>`__
  99. demo for an example of this.
  100. Advantages
  101. ^^^^^^^^^^
  102. - Any Control node can be used, including Label, RichTextLabel or even nodes such
  103. as Button. This allows for powerful formatting and GUI interaction.
  104. - The script-based approach allows for complete freedom in positioning.
  105. For example, this makes it considerably easier to pin Controls to the screen's
  106. edges when they go off-screen (for in-game 3D markers).
  107. - Control theming is obeyed. This allows for easier customization that globally
  108. applies to the project.
  109. Limitations
  110. ^^^^^^^^^^^
  111. - Projected Controls cannot be occluded by 3D geometry in any way. You can use a
  112. RayCast to fully hide the control if its target position is occluded by a
  113. collider, but this doesn't allow for partially hiding the control behind a
  114. wall.
  115. - Changing text size depending on distance by adjusting the Control's ``scale``
  116. property is possible, but it needs to be done manually. Label3D and TextMesh
  117. automatically take care of this, at the cost of less flexibility (can't set a
  118. minimum/maximum text size in pixels).
  119. - Handling resolution and aspect ratio changes must be taken into account in the
  120. script, which can be challenging.
  121. Should I use Label3D, TextMesh or a projected Control?
  122. ------------------------------------------------------
  123. In most scenarios, Label3D is recommended as it's easier to set up and provides
  124. higher rendering quality (especially if 3D antialiasing is disabled).
  125. For advanced use cases, TextMesh is more flexible as it allows styling the text
  126. with custom shaders. Custom shaders allow for modifying the final geometry, such
  127. as curving the text along a surface. Since the text is actual 3D geometry, the
  128. text can optionally have depth to it and can also contribute to global
  129. illumination.
  130. If you need features such as BBCode or Control theming support, then using a projected
  131. RichTextLabel node is the only way to go.