天天看点

HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述

HDRP,自定义DecalGraph,以实现AlphaCutoff等功能

  • 综述
    • 1. Emission无法AlphaCutoff
    • 2. Decal根据Layer判断是否接受投影,而不是Lit.ReceiveDecal

综述

HDRP自带了多种Shader,如Lit,Decal,Unlit,LayeredLit,TerrainLit等,可实现多种效果,具体参数可查询UnityLearn或官方文档。在笔者的使用过程中(Unity 2019.4.10f, HDRP7.3.1),遭遇了某些Decal表现上的问题,所以尝试以其他方式实现。

1. Emission无法AlphaCutoff

普通Decal 开启Emission后
HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述
HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述
HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述
HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述

很明显,BaseMap上部分Alpha为0,直接Decal上去也进行了Cutoff,但是对于Emission,用相同贴图进行采样就没有进行CutOff,导致圆周外围部分也进行了Emission,与需求效果不符。

经过多番测试,自定义一个DecalGraph,自行实现Cutoff可以解决问题。

  • 首先,创建一个DecalGraph, Create/Shader/HDRP/Decal Graph
  • 创建变量如下"
    HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述

    _BaseMap :对应Decal的贴图

    _BaseColor: BaseMap采样后Multiply的颜色

    _EnableEmission: 是否开启Emission

    _EmissionColor: Emission颜色(默认采用BaseMap,可自行修改)

    _EmissionIntensity:Emission强度

    _EimissionWeight: Emission权重(用于混合BaseColor + EmissionColor)

  • 核心思路:

    通过BaseMap采样的Alpha进行Branch操作,如果>0才输出Color/Emission,否则不输出. BaseMap输出BaseColor和BaseColor Opacity都可以采用这种判断

    HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述
  • EmissionNode:

    HDRP中存在一个EmissionNode,只有使用这个节点并配置参数才能真正开启Emission.使用之前定义的变量为节点赋值,最终结果输出给DecalMaster的Emission就好.

    HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述
    此外Metal,Smooth等参数也有影响,需要微调.
  • 最终结果如下:
    HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述
HDRP 自定义DecalGraph,以实现AlphaCutoff等功能综述

文件链接:

https://download.csdn.net/download/weixin_53766553/13820131

2. Decal根据Layer判断是否接受投影,而不是Lit.ReceiveDecal

这个问题在HDRP 9.x/10.x版本中会得到解决,当前版本暂时没有解决办法,先留个坑。