unity-game-engine - 如何在着色器中定义自定义预处理器宏?

标签 unity-game-engine hlsl

我尝试在自定义着色器中使用预处理器宏,以便在 Unity 编辑器中执行不同的步骤:

#if defined(IS_UNITY_EDITOR)
    // something
#else
    // other thing
#endif

为了实现这一目标,我正在尝试 the Shader.EnableKeyword() method在 MonoBehavior 中:

if (Application.isEditor) {
    Shader.EnableKeyword("IS_UNITY_EDITOR");
}

但是,看起来我的着色器正在编译之前 MonoBehavior 可以检查它是否在统一编辑器中。我尝试在 Start() 上运行它,于Awake() , OnEnable()但着色器永远不会收到 IS_UNITY_EDITOR定义。我如何定义IS_UNITY_EDITOR在编译着色器之前在我的着色器中?

最佳答案

刚刚偶然发现this doc page这解释了多重编译是如何工作的。为了能够创建两个分支,我必须通过编写 #pragma multi_compile 行来告诉编译器我将使用 IS_UNITY_EDITOR 关键字:

    SubShader {
        Pass {
            CGPROGRAM
            #pragma multi_compile __ IS_UNITY_EDITOR
            #pragma vertex vertShader
            #pragma fragment fragShader
            // ...

双下划线__表示着色器的一个版本将具有IS_UNITY_EDITOR,而另一个版本将没有任何定义。

关于unity-game-engine - 如何在着色器中定义自定义预处理器宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64924780/

相关文章:

unity-game-engine - 团结 : Is it possible to use 2 passes consecutively?

unity-game-engine - 在小窗口而不是全屏中运行 unity exe 文件

optimization - HLSL 分支规避

graphics - HLSL:在像素着色器中获取纹理尺寸

android - Unity Android 构建为 Application.streamingAssetsPath 中的文件提供 DirectoryNotFoundException

c# - 使用 JsonFX 反序列化字典

c# - Unity 中相机平滑变焦的问题

range - HLSL 中的寄存器范围?

c++ - 为像素着色器设置统一颜色

c++ - 加载和使用 HLSL 着色器?