Как мне определить пользовательский макрос препроцессора в моем шейдере?

#unity3d #hlsl

#unity3d #hlsl

Вопрос:

Я пытаюсь использовать макрос препроцессора в моем пользовательском шейдере, чтобы он выполнял другой шаг, если он находится в редакторе Unity:

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

Для достижения этой цели я пробую Shader.EnableKeyword() метод в режиме MonoBehavior:

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

Однако, похоже, что мой шейдер компилируется до того, как MonoBehavior сможет проверить, находится ли он в редакторе Unity. Я пытался запустить его Start() Awake() , OnEnable() но шейдер никогда не получает IS_UNITY_EDITOR определение. Как я могу определить IS_UNITY_EDITOR в своем шейдере до компиляции шейдера?

Ответ №1:

Просто наткнулся на эту страницу документа, которая объясняет, как работает мультикомпиляция. Чтобы иметь возможность создавать две ветви, я должен сообщить компилятору, что я буду использовать IS_UNITY_EDITOR ключевое слово, написав #pragma multi_compile строку:

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

Двойное подчеркивание __ означает, что одна версия шейдера будет иметь IS_UNITY_EDITOR , а в другой версии ничего не будет определено.