【URP14】EnumをHLSLコードに生成するGenerateHLSLを試す

2024/06/06に公開

環境

  • Unity2022.3.31f1
  • UniversalRP 14.0.11

概要

C#のenumをシェーダー上の定数に変換できる GenerateHLSL アトリビュートについて紹介します。

Chapter1. GenerateHLSLを試す

enumの定義 (C#)

以下のようなenumを定義します。

Assets/Scripts/MySampleEnum.cs
using UnityEngine.Rendering;

[GenerateHLSL]
public enum MySampleEnum
{
    Zero = 0,
    One = 1,
    Two = 2,
    Twenty = 20,
}

HLSLの生成

メニューから Edit > Rendering > Generate Shader Includes を選択します

結果

スクリプトと同じ階層に、HLSLコードが生成されます。
かなり簡単にHLSLが生成されました。

Assets/Scripts/MySampleEnum.cs.hlsl
//
// This file was automatically generated. Please don't edit by hand. Execute Editor command [ Edit > Rendering > Generate Shader Includes ] instead
//

#ifndef MYSAMPLEENUM_CS_HLSL
#define MYSAMPLEENUM_CS_HLSL
//
// MySampleEnum:  static fields
//
#define MYSAMPLEENUM_ZERO (0)
#define MYSAMPLEENUM_ONE (1)
#define MYSAMPLEENUM_TWO (2)
#define MYSAMPLEENUM_TWENTY (20)


#endif

Chapter2. 出力先を指定する

sourcePathを利用することで、HLSLファイルを好きな場所に出力できます。

Assets/Scripts/MySampleEnum.cs
using UnityEngine.Rendering;

[GenerateHLSL(sourcePath:"Assets/Shaders/MyShaderInclude")]
public enum MySampleEnum
{
    Zero = 0,
    One = 1,
    Two = 2,
    Twenty = 20,
}

出力されるHLSLファイルのパスは

Assets/Shaders/MyShaderInclude.hlsl

となります。

リンク

GenerateHLSL完全に理解した - 太郎Work
https://tarowork.hatenablog.jp/entry/2022/12/06/231537

Class GenerateHLSL | Core RP Library | 14.0 - Unity
https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@14.0/api/UnityEngine.Rendering.GenerateHLSL.html

Synchronizing shader code and C# | Core RP Library | 12.0.0
https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@12.0/manual/generating-shader-includes.html

Discussion