Consigue un 20% de descuento usando el código RELEASE en la compra de tu libro. Por tiempo limitado.

Introducción al lenguaje de programación de shaders

3.0.9. MPD KeywordEnum

Esta publicación está disponible en...

Este drawer genera un menú estilo emergente en el inspector del material. A diferencia de un Toggle, este drawer permite configurar hasta nueve estados distintos para nuestro shader. Para ejecutarlo debemos agregar la palabra “KeywordEnum” entre corchetes y luego enumerar el conjunto de estados que vamos a utilizar.

[KeywordEnum(State_Off, State_01, etc...)] 
    _PropertieName (“Display name”, Float) = 0

En el ejemplo anterior agregamos el drawer KeywordEnum dentro de corchetes y luego enumeramos sus estados, en donde el primero corresponde al estado por defecto (StateOff). Continuamos con la declaración de la propiedad, su nombre de aparición en el inspector del material, su tipo de dato Float y finalmente inicializamos en su valor por defecto.

Para declarar este drawer dentro de nuestro código podemos utilizar tanto el shader variant shader_feature como multi_compile. La elección va a depender de la cantidad de variantes que deseamos incluir en el build final.

Como ya sabemos, shader_feature sólo exportará la variante seleccionada desde el inspector del material, en cambio, multi_compile exportada todas las variantes que se encuentran en el shader, independientemente si las utilizamos o no. Dada esta característica, multi_compile es ideal para exportar o compilar múltiples estados que van a cambiar en tiempo de ejecución (e.g. estado de estrella en Super Mario).

Para entender su implementación realizaremos la siguiente operación:

Shader “InspectorPath / shaderName”
{
    Properties 
    {
    // declare Toggle drawer
    [KeywordEnum(Off, Red, Blue)] 
        _Options (“Color Options”, Float) = 0
    } 
    SubShader
    {
        Pass
        {
            CGPROGRAM
            ...
            // declare pragma and conditions 
            #pragma multi_compile _OPTIONS_OFF _OPTIONS_RED  _OPTIONS_BLUE
            ...
            half4 frag (v2f i) : SV_Target
            {
                half4 col = tex2D(_MainTex, i.uv);    
    
                // generate conditions 
                #if _OPTIONS_OFF 
                     return col;        
                #elif _OPTIONS_RED 
                     return col * float4(1, 0, 0, 1);        
                #elif _OPTIONS_BLUE
                     return col * float4(0, 0, 1, 1);    
                #endif
            }
            ENDCG
        }
    }
}

En el ejemplo anterior, declaramos una propiedad tipo KeywordEnum llamada “_Options” y configuramos tres estados para ella (Off, Red y Blue). Luego agregamos al multi_compile que se encuentra en el CGPROGRAM, y declaramos a sus tres estamos como constantes.

#pragma multi_compile _OPTIONS_OFF _OPTIONS_RED  _OPTIONS_BLUE

Finalmente, utilizando las condicionales definimos los tres estados para nuestro shader que en sí corresponden cambios de color para la textura principal.

Siguenos para mantenerte informado sobre todas las novedades, actualizaciones y más.

Únete al grupo para compartir tus experiencias con otros desarrolladores.

¡Suscríbete a nuestro canal y sigue aprendiendo sobre desarrollo de juegos!

jettelly-logo

Jettelly Team

Somos un equipo de desarrolladores independientes con más de 9 años de experiencia en videojuegos. Como estudio independiente, hemos desarrollado Nom Noms el que publicamos con Hyperbeard en 2019. Actualmente estamos desarrollando La Biblia de Shader en Unity.

Síguenos en nuestras redes sociales.