Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document alpha antialiasing in Standard Material 3D #8481

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions tutorials/3d/3d_antialiasing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,12 @@ shaders are still run for each pixel only once. Therefore, MSAA does not reduce
transparency aliasing for materials using the **Alpha Scissor** transparency
mode (1-bit transparency). MSAA is also ineffective on specular aliasing.

To mitigate aliasing on alpha scissor materials, alpha antialiasing (also called
*alpha to coverage*) can be enabled on specific materials in the
StandardMaterial3D or ORMMaterial3D properties. This only has an effect when
MSAA is used (with any level). Alpha to coverage has a moderate performance
cost, but it's very effective at reducing aliasing on transparent materials
without introducing any blurriness.
To mitigate aliasing on alpha scissor materials,
:ref:`alpha antialiasing <doc_standard_material_3d_alpha_antialiasing>`
(also called *alpha to coverage*) can be enabled on specific materials in the
StandardMaterial3D or ORMMaterial3D properties. Alpha to coverage has a
moderate performance cost, but it's effective at reducing aliasing on
transparent materials without introducing any blurriness.

MSAA can be enabled in the Project Settings by changing the value of the
**Rendering > Anti Aliasing > Quality > MSAA 3D** setting. It's important to change
Expand Down
2 changes: 1 addition & 1 deletion tutorials/3d/3d_rendering_limitations.rst
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ this feature. There are still several ways to avoid this problem:

- If you want a material to fade with distance, use the StandardMaterial3D
distance fade mode **Pixel Dither** or **Object Dither** instead of
**PixelAlpha**. This will make the material opaque, which also speeds up rendering.
**Pixel Alpha**. This will make the material opaque, which also speeds up rendering.

.. figure:: img/3d_rendering_limitations_transparency_sorting.webp
:align: center
Expand Down
146 changes: 125 additions & 21 deletions tutorials/3d/standard_material_3d.rst
Original file line number Diff line number Diff line change
Expand Up @@ -47,30 +47,134 @@ with the export preset for unreal engine, which also uses ORM textures.
Transparency
------------

In Godot, materials are not transparent unless specifically configured to be.
The main reason behind this is that transparent materials are rendered
using a different technique (sorted from back to front and rendered in order).
By default, materials in Godot are opaque. This is fast to render, but it means
the material can't be seen through even if you use a transparent texture in the
**Albedo > Texture** property (or set **Albedo > Color** to a transparent color).

This technique is less efficient (many state changes happen) and makes
the materials unusable with many mid- and post-processing effects
(such as SSAO, SSR, etc.) that require perfectly opaque geometry.
To be able to see through a material, the material needs to be made *transparent*.
Godot offers several transparency modes:

For this reason, materials in Godot are assumed opaque unless
specified otherwise. The main settings that enable transparency are:
- **Disabled:** Material is opaque. This is the fastest to render, with all
rendering features supported.

* Transparency (this one)
* Blend mode set to other than "Mix"
* Enabling distance or proximity fade
- **Alpha:** Material is transparent. Semi-transparent areas are drawn with
blending. This is slow to render, but it allows for partial transparency (also
known as translucency). Materials using alpha blending also can't cast
shadows, and are not visible in screen-space reflections.

When transparency other than ``0`` or ``1`` is not needed, it's possible to
set a threshold to prevent the object from rendering semi-transparent pixels
using the alpha scissor option.
- **Alpha** is a good fit for particle effects and VFX.

- **Alpha Scissor:** Material is transparent. Semi-transparent areas whose
opacity is below **Alpha Scissor Threshold** are not drawn (above this
opacity, these are drawn as opaque). This is faster to render than Alpha and
doesn't exhibit transparency sorting issues. The downside is that this results
in "all or nothing" transparency, with no intermediate values possible.
Materials using alpha scissor can cast shadows.

- **Alpha Scissor** is ideal for foliage and fences, since these have hard
edges and require correct sorting to look good.

- **Alpha Hash:** Material is transparent. Semi-transparent areas are drawn
using dithering. This is also "all or nothing" transparency, but dithering
helps represent partially opaque areas with limited precision depending on
viewport resolution. Materials using alpha hash can cast shadows.

- **Alpha Hash** is suited for realistic-looking hair, although stylized hair
may work better with alpha scissor.

- **Depth Pre-Pass:** This renders the object's fully opaque pixels via the
opaque pipeline first, then renders the rest with alpha blending. This allows
transparency sorting to be *mostly* correct (albeit not fully so, as partially
transparent regions may still exhibit incorrect sorting). Materials using
depth prepass can cast shadows.

.. note::

Godot will automatically force the material to be transparent with alpha
blending if *any* of these conditions is met:

- Setting the transparency mode to **Alpha** (as described here).
- Setting a blend mode other than the default **Mix**
- Enabling **Refraction**, **Proximity Fade**, or **Distance Fade**.

Comparison between alpha blending (left) and alpha scissor (right) transparency:

.. image:: img/spatial_material12.png

This renders the object via the opaque pipeline when opaque pre-pass is on,
which is faster and allows it to use mid- and post-process effects such as
SSAO, SSR, etc.
.. warning::

Alpha-blended transparency has several
:ref:`limitations <doc_3d_rendering_limitations_transparency_sorting>`:

- Alpha-blended materials are significantly slower to render, especially if
they overlap.
- Alpha-blended materials may exhibit sorting issues when transparent
surfaces overlap each other. This means that surfaces may render in the
incorrect order, with surfaces in the back appearing to be in front of
those which are actually closer to the camera.
- Alpha-blended materials don't cast shadows, although they can receive shadows.
- Alpha-blended materials don't appear in any reflections (other than
reflection probes).
- Screen-space reflections and sharp SDFGI reflections don't appear on
alpha-blended materials. When SDFGI is enabled, rough reflections are used
as a fallback regardless of material roughness.

Before using the **Alpha** transparency mode, always consider whether
another transparency mode is more suited for your needs.

.. _doc_standard_material_3d_alpha_antialiasing:

Alpha Antialiasing
~~~~~~~~~~~~~~~~~~

.. note::

This property is only visible when the transparency mode is
**Alpha Scissor** or **Alpha Hash**.

While alpha scissor and alpha hash materials are faster to render than
alpha-blended materials, they exhibit hard edges between opaque and transparent
regions. While it's possible to use post-processing-based :ref:`antialiasing
techniques <doc_3d_antialiasing>` such as FXAA and TAA, this is not always
desired as these techniques tend to make the final result look blurrier or
exhibit ghosting artifacts.

There are 3 alpha antialiasing modes available:

- **Disabled:** No alpha antialiasing. Edges of transparent materials will
appear aliased unless a post-processing-based antialiasing solution is used.
- **Alpha Edge Blend:** Results in a smooth transition between opaque and
transparent areas. Also known as "alpha to coverage".
- **Alpha Edge Clip:** Results in a sharp, but still antialiased transition
between opaque and transparent areas. Also known as "alpha to coverage + alpha
to one".

When the alpha antialiasing mode is set to **Alpha Edge Blend** or **Alpha Edge
Clip**, a new **Alpha Antialiasing Edge** property becomes visible below in the
inspector. This property controls the threshold below which pixels should be
made transparent. While you've already defined an alpha scissor threshold (when
using **Alpha Scissor** only), this additional threshold is used to smoothly
transition between opaque and transparent pixels. **Alpha Antialiasing Edge**
must *always* be set to a value that is strictly below the alpha scissor
threshold. The default of ``0.3`` is a sensible value with an alpha scissor of
threshold of ``0.5``, but remember to adjust this alpha antialiasing edge when
modifying the alpha scissor threshold.

If you find the antialiasing effect not effective enough, try increasing **Alpha
Antialiasing Edge** while making sure it's below **Alpha Scissor Threshold** (if
the material uses alpha scissor). On the other hand, if you notice the texture's
appearance visibly changing as the camera moves closer to the material, try
decreasing **Alpha Antialiasing Edge**.

.. important::

For best results, MSAA 3D should be set to at least 2× in the Project
Settings when using alpha antialiasing. This is because this feature relies
on alpha to coverage, which is a feature provided by MSAA.

Without MSAA, a fixed dithering pattern is applied on the material's edges,
which isn't very effective at smoothing out edges (although it can still
help a little).

Blend Mode
~~~~~~~~~~
Expand Down Expand Up @@ -377,9 +481,9 @@ such as plant leaves, grass, human ears, etc.
Refraction
----------

When refraction is enabled, it supersedes alpha blending, and Godot attempts to
fetch information from behind the object being rendered instead. This allows
distorting the transparency in a way similar to refraction in real life.
When refraction is enabled, Godot attempts to fetch information from behind the
object being rendered. This allows distorting the transparency in a way similar
to refraction in real life.

Remember to use a transparent albedo texture (or reduce the albedo color's alpha
channel) to make refraction visible, as refraction relies on transparency to
Expand Down Expand Up @@ -555,7 +659,7 @@ This is useful mostly for indicators (no depth test and high render priority)
and some types of billboards.

Use Point Size
~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~

This option is only effective when the geometry rendered is made of points
(generally it's made of triangles when imported from 3D modeling software). If
Expand Down