Skip to content
Vladislav Kantaev edited this page May 4, 2024 · 11 revisions

Setup

📝 Note: decals require Depth Pre-Pass in their minimal implementation.

Decals in Toon RP require setting up a custom shader. The following are instructions for Shader Graph:

  • Create a new Default/Unlit shader graph (Create/Shader Graph/Toon RP -> Default Shader Graph or Unlit Shader Graph).
  • In Graph Settings:
  • Set Surface Type to Transparent;
  • Disable Cast Shadows;
  • Enable Alpha Clipping.
  • Create the following setup:
  • Toon RP Decal Space UV SubGraph provides UV, which we use to sample a texture.
  • Pass Clip Value decal node output through a new Toon RP Decal Alpha Clip Value SubGraph node and multiply texture alpha with the result.
  • Plug the resulting color and alpha to the corresponding inputs of the fragment stage.
  • (For Default Shader Graph) Pass PositionWS from the decal node to the fragment output.

image

The next step is to setup a decal GameObject:

  • Create 3D Object/Cube.
  • Remove the collider component.
  • Setup the decals size (Scale) and rotation:
  • The decal is projected onto the XY size along the Z axis (local forward direction/blue arrow).

image

image

Options

Correct Normals for Lighting

📝 Note: requires Normals Pre-Pass.

  • In Graph Settings, set Fragment Normal Space to World.
  • Add a Toon RP Scene Normals SubGraph node and pass its result to the Normal (World Space) fragment output.

Angle Clip

📝 Note: requires Normals Pre-Pass.

To avoid projecting decals onto steep surfaces, setup angle clipping:

  • Add a Toon RP Decal Angle Clip Value SubGraph node, add its result with the ClipValue output of the Toon RP Decal Space UV SubGraph.
  • Pass the addition result to Toon RP Decal Alpha Clip Value SubGraph.
  • Multiply the output with the texture alpha and pass the result to the Alpha fragment output.

image

Layering

To mimic the behavior of URP's Rendering Layers, one could use Stencil Buffer. The exact implementation is very project-dependent, therefore Toon RP does not provide a built-in option. An implementation might look like this:

  • Render the decal-receiving layer (e.g., a terrain) with a certain stencil bit set.
  • Render the rest of the opaque geometry setting the bit to 0.
  • Render decals with stencil test: pass only pixels where the stencil bit is set.

📝 Note: enable Control Stencil in a Shader Graph's Graph Inspector to allow controlling stencil values per-material.