visual_shaders.rst 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. .. _doc_visual_shaders:
  2. Using VisualShaders
  3. ===================
  4. VisualShaders are the visual alternative for creating shaders.
  5. As shaders are inherently linked to visuals, the graph-based approach with
  6. previews of textures, materials, etc. offers a lot of additional convenience
  7. compared to purely script-based shaders. On the other hand, VisualShaders do not
  8. expose all features of the shader script and using both in parallel might be
  9. necessary for specific effects.
  10. .. note::
  11. If you are not familiar with shaders, start by reading
  12. :ref:`doc_introduction_to_shaders`.
  13. Creating a VisualShader
  14. -----------------------
  15. VisualShaders can be created in any :ref:`class_ShaderMaterial`. To begin using
  16. VisualShaders, create a new ``ShaderMaterial`` in an object of your choice.
  17. .. image:: img/shader_material_create_mesh.webp
  18. Then assign a :ref:`class_Shader` resource to the ``Shader`` property.
  19. .. image:: img/visual_shader_create.webp
  20. Click on the new ``Shader`` resource and the Create Shader dialog will
  21. open automatically. Change the Type option to :ref:`class_VisualShader`
  22. in the dropdown, then give it a name.
  23. .. image:: img/visual_shader_create2.webp
  24. Click on the visual shader you just created to open the Shader Editor.
  25. The layout of the Shader Editor comprises four parts, a file list on
  26. the left, the upper toolbar, the graph itself, and a material preview
  27. on the right that can be toggled off
  28. .. image:: img/visual_shader_editor2.webp
  29. From left to right in the toolbar:
  30. - The arrow can be used to toggle the files panel's visibility.
  31. - The ``File`` button opens a dropdown menu for saving, loading, and creating
  32. files.
  33. - The ``Add Node`` button displays a popup menu to let you add nodes to the
  34. shader graph.
  35. - The drop-down menu is the shader type: Vertex, Fragment and Light. Like for
  36. script shaders, it defines what built-in nodes will be available.
  37. - The following buttons and number input control the zooming level, grid
  38. snapping and distance between grid lines (in pixels).
  39. - The toggle controls if the graph minimap in the bottom right of the editor
  40. is visible or not.
  41. - The automatically arrange selected nodes button will try to organize any
  42. nodes you have selected as efficiently and cleanly as possible.
  43. - The Manage Varyings button opens a dropdown that lets you add or remove a
  44. varying.
  45. - The show generated code button shows shader code corresponding to your graph.
  46. - The toggle turns the material preview on or off.
  47. - The ``Online Docs`` button opens this documentation page in your web browser.
  48. - The last button allows you to put the shader editor in its own window,
  49. separate from the rest of the editor.
  50. .. note::
  51. Although VisualShaders do not require coding, they share the same logic with
  52. script shaders. It is advised to learn the basics of both to have a good
  53. understanding of the shading pipeline.
  54. The visual shader graph is converted to a script shader behind the scene,
  55. and you can see this code by pressing the last button in the toolbar. This
  56. can be convenient to understand what a given node does and how to reproduce
  57. it in scripts.
  58. Using the Visual Shader Editor
  59. ------------------------------
  60. By default, every new ``VisualShader`` will have an output node. Every node
  61. connection ends at one of the output node's sockets. A node is the basic unit to
  62. create your shader. To add a new node, click on the ``Add Node`` button on the
  63. upper left corner or right click on any empty location in the graph, and a menu
  64. will pop up.
  65. .. image:: img/vs_popup.webp
  66. This popup has the following properties:
  67. - If you right-click on the graph, this menu will be called at the cursor
  68. position and the created node, in that case, will also be placed under that
  69. position; otherwise, it will be created at the graph's center.
  70. - It can be resized horizontally and vertically allowing more content to be
  71. shown. Size transform and tree content position are saved between the calls,
  72. so if you suddenly closed the popup you can easily restore its previous state.
  73. - The ``Expand All`` and ``Collapse All`` options in the drop-down option menu
  74. can be used to easily list the available nodes.
  75. - You can also drag and drop nodes from the popup onto the graph.
  76. While the popup has nodes sorted in categories, it can seem overwhelming at
  77. first. Try to add some of the nodes, plug them in the output socket and observe
  78. what happens.
  79. When connecting any ``scalar`` output to a ``vector`` input, all components of
  80. the vector will take the value of the scalar.
  81. When connecting any ``vector`` output to a ``scalar`` input, the value of the
  82. scalar will be the average of the vector's components.
  83. Visual Shader node interface
  84. ------------------------------
  85. Visual shader nodes have input and output ports. The input ports are located on the left side of the node, and output ports are located on the right side of the node.
  86. .. figure:: img/vs_node.webp
  87. These ports are colored to differentiate type of port:
  88. .. |scalar| image:: img/vs_scalar.webp
  89. .. |vector| image:: img/vs_vector.webp
  90. .. |boolean| image:: img/vs_boolean.webp
  91. .. |transform| image:: img/vs_transform.webp
  92. .. |sampler| image:: img/vs_sampler.webp
  93. .. list-table:: Port types
  94. :widths: auto
  95. :header-rows: 1
  96. * - Type
  97. - Color
  98. - Description
  99. - Example
  100. * - Scalar
  101. - Gray
  102. - Scalar is a single value.
  103. - |scalar|
  104. * - Vector
  105. - Purple
  106. - Vector is a set of values.
  107. - |vector|
  108. * - Boolean
  109. - Green
  110. - On or off, true or false.
  111. - |boolean|
  112. * - Transform
  113. - Pink
  114. - A matrix, usually used to transform vertices.
  115. - |transform|
  116. * - Sampler
  117. - Orange
  118. - A texture sampler. It can be used to sample textures.
  119. - |sampler|
  120. All of the types are used in the calculations of vertices, fragments, and lights in the shader. For example: matrix multiplication,
  121. vector addition, or scalar division.
  122. There are other types but these are the main ones.
  123. Visual Shader nodes
  124. -------------------
  125. Below are some special nodes that are worth knowing about. The list is not
  126. exhaustive and might be expanded with more nodes and examples.
  127. Expression node
  128. ~~~~~~~~~~~~~~~
  129. The ``Expression`` node allows you to write Godot Shading Language (GLSL-like)
  130. expressions inside your visual shaders. The node has buttons to add any amount
  131. of required input and output ports and can be resized. You can also set up the
  132. name and type of each port. The expression you have entered will apply
  133. immediately to the material (once the focus leaves the expression text box). Any
  134. parsing or compilation errors will be printed to the Output tab. The outputs are
  135. initialized to their zero value by default. The node is located under the
  136. Special tab and can be used in all shader modes.
  137. The possibilities of this node are almost limitless – you can write complex
  138. procedures, and use all the power of text-based shaders, such as loops, the
  139. ``discard`` keyword, extended types, etc. For example:
  140. .. image:: img/vs_expression2.png
  141. Reroute node
  142. ~~~~~~~~~~~~
  143. The ``Reroute`` node is used purely for organizational purposes. In a complicated
  144. shader with many nodes you may find that the paths between nodes can make
  145. things hard to read. Reroute, as its name suggests, allows you to adjust the path
  146. between nodes to make things easier to read. You can even have multiple reroute
  147. nodes for a single path, which can be used to make right angles.
  148. .. image:: img/vs_reroute.webp
  149. To move a reroute node move your mouse cursor above it, and grab the handle that
  150. appears.
  151. .. image:: img/vs_reroute_handle.webp
  152. Fresnel node
  153. ~~~~~~~~~~~~
  154. The ``Fresnel`` node is designed to accept normal and view vectors and produces
  155. a scalar which is the saturated dot product between them. Additionally, you can
  156. setup the inversion and the power of equation. The ``Fresnel`` node is great for
  157. adding a rim-like lighting effect to objects.
  158. .. image:: img/vs_fresnel.webp
  159. Boolean node
  160. ~~~~~~~~~~~~
  161. The ``Boolean`` node can be converted to ``Scalar`` or ``Vector`` to represent
  162. ``0`` or ``1`` and ``(0, 0, 0)`` or ``(1, 1, 1)`` respectively. This property
  163. can be used to enable or disable some effect parts with one click.
  164. .. image:: img/vs_boolean.gif
  165. If node
  166. ~~~~~~~
  167. The ``If`` node allows you to setup a vector which will be returned the result
  168. of the comparison between ``a`` and ``b``. There are three vectors which can be
  169. returned: ``a == b`` (in that case the tolerance parameter is provided as a
  170. comparison threshold – by default it is equal to the minimal value, i.e.
  171. ``0.00001``), ``a > b`` and ``a < b``.
  172. .. image:: img/vs_if.png
  173. Switch node
  174. ~~~~~~~~~~~
  175. The ``Switch`` node returns a vector if the boolean condition is ``true`` or
  176. ``false``. ``Boolean`` was introduced above. If you want to convert a vector
  177. to a true boolean, all components of the vector should be non-zero.
  178. .. image:: img/vs_switch.webp
  179. Mesh Emitter
  180. ~~~~~~~~~~~~
  181. The ``Mesh Emitter`` node is used for emitting particles from mesh vertices. This is
  182. only available for shaders that are in ``Particles`` mode.
  183. Keep in mind that not all 3D objects are mesh files. a glTF file can't be dragged
  184. and dropped into the graph. However, you can create an inherited scene from it,
  185. save the mesh in that scene as its own file, and use that.
  186. .. image:: img/vs_meshemitter.webp
  187. You can also drag and drop obj files into the graph editor to add the node
  188. for that specific mesh, other mesh files will not work for this.