본문 바로가기
Shader

URP Shader 에서 Set Material Keyword 찾기

by 대마왕J 2021. 4. 27.

URP 셰이더들에 보면 메터리얼 키워드들이 정의되어 있는데, 이걸 활성화 시켜주는 부분을 찾을 수가 없다. 

 

 // Material Keywords
 #pragma shader_feature_local_fragment _ALPHATEST_ON
 #pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
 #pragma shader_feature_local_fragment _ _SPECGLOSSMAP _SPECULAR_COLOR
 #pragma shader_feature_local_fragment _GLOSSINESS_FROM_BASE_ALPHA
 #pragma shader_feature_local _NORMALMAP
 #pragma shader_feature_local_fragment _EMISSION
 #pragma shader_feature_local _RECEIVE_SHADOWS_OFF

뭐 이런거지. 

 

이렇게 찾을 수 없으면 분명 Custom Shader GUI 에 정의되어 있는 거겠지.. 하고 보니까 안보인다. 

아니 .. 정확히 말하면 정의되어 있긴 하다. 

public override void MaterialChanged(Material material)
        {
            if (material == null)
                throw new ArgumentNullException("material");

            SetMaterialKeywords(material, SimpleLitGUI.SetMaterialKeywords);
        }

요로케

SetMaterialKeywords(materialSimpleLitGUI.SetMaterialKeywords);

에 말이다. 

 

그리고 이 클래스는 BaseShaderGUI 에서 상속받았으므로 BaseShaderGUI를 찾아보면 

 

public static void SetMaterialKeywords(Material material, Action<Material> shadingModelFunc = null, Action<Material> shaderFunc = null)
        {
            // Clear all keywords for fresh start
            material.shaderKeywords = null;

            // Setup blending - consistent across all Universal RP shaders
            SetupMaterialBlendMode(material);

            // Receive Shadows
            if(material.HasProperty("_ReceiveShadows"))
                CoreUtils.SetKeyword(material, "_RECEIVE_SHADOWS_OFF", material.GetFloat("_ReceiveShadows") == 0.0f);

            // Emission
            if (material.HasProperty("_EmissionColor"))
                MaterialEditor.FixupEmissiveFlag(material);
            bool shouldEmissionBeEnabled =
                (material.globalIlluminationFlags & MaterialGlobalIlluminationFlags.EmissiveIsBlack) == 0;
            if (material.HasProperty("_EmissionEnabled") && !shouldEmissionBeEnabled)
                shouldEmissionBeEnabled = material.GetFloat("_EmissionEnabled") >= 0.5f;
            CoreUtils.SetKeyword(material, "_EMISSION", shouldEmissionBeEnabled);

            // Normal Map
            if (material.HasProperty("_BumpMap"))
                CoreUtils.SetKeyword(material, "_NORMALMAP", material.GetTexture("_BumpMap"));

            // Shader specific keyword functions
            shadingModelFunc?.Invoke(material);
            shaderFunc?.Invoke(material);
        }

이렇게 키워드가 정의되어 있는 것을 볼 수 있다. 거 피곤하게 꼬아놨구만

 

반응형

댓글