Version: 2021.1
Rendering con Shaders Remplazados
Utilizando Depth Textures (Texturas de profundidad)

Custom Shader GUI (GUI Shader Personalizado)

A veces tiene un shader con algunos tipos de datos interesantes que no se pueden representar bien utilizando el editor de materiales de Unity incorporado. Unity proporciona una forma de anular la forma predeterminada en la que se presentan las propiedades del sombreador para que pueda definir las propias. Puede utilizar esta función para definir controles personalizados y validación de rango de datos.

La primera parte para escribir un editor personalizado para el GUI de su shader es la definición de un shader que requiere un Custom Editor. El nombre que utiliza para el editor personalizado es la clase que Unity buscará para el editor de materiales.

Para definir un editor personalizado, se extiende desde la clase ShaderGUI y coloca el script debajo de una carpeta Editor en el directorio assets.

using UnityEditor;

public class CustomShaderGUI : ShaderGUI 
{
    public override void OnGUI (MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        base.OnGUI (materialEditor, properties);
    }
}

Cualquier shader que tenga definido un editor personalizado (CustomEditor “CustomShaderGUI”) instanciará una instancia de la clase GUI del shader listado arriba y ejecutará el código asociado.

Un ejemplo simple

Así que tenemos una situación en la que tenemos un shader que puede trabajar en dos modos; Hace la iluminación difusa estándar o renderiza los canales azules y verdes con el 50%.

Shader "Custom/Redify" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert addshadow
        #pragma shader_feature REDIFY_ON

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;

            #if REDIFY_ON
            o.Albedo.gb *= 0.5;
            #endif
        }
        ENDCG
    } 
    CustomEditor "CustomShaderGUI"
}

Como se puede ver el shader tiene una palabra clave disponible para la configuración: REDIFY_ON. Esto se puede cambiar, se puede configurar en una base de material utilizando la propiedad shaderKeywords del material. A continuación se muestra una instancia de ShaderGUI que hace esto.

using UnityEngine;
using UnityEditor;
using System;

public class CustomShaderGUI : ShaderGUI
{
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        // render the default gui
        base.OnGUI(materialEditor, properties);

        Material targetMat = materialEditor.target as Material;

        // see if redify is set, and show a checkbox
        bool redify = Array.IndexOf(targetMat.shaderKeywords, "REDIFY_ON") != -1;
        EditorGUI.BeginChangeCheck();
        redify = EditorGUILayout.Toggle("Redify material", redify);
        if (EditorGUI.EndChangeCheck())
        {
            // enable or disable the keyword based on checkbox
            if (redify)
                targetMat.EnableKeyword("REDIFY_ON");
            else
                targetMat.DisableKeyword("REDIFY_ON");
        }
    }
}

Para ver un ejemplo de ShaderGUI más completo, vea el archivo StandardShaderGUI.cs junto con el archivo Standard.shader que se encuentra en el paquete “Shaders integrados” que se puede descargar desde Unity Download Archive.

Tenga en cuenta que el ejemplo simple anterior también podría ser resuelto mucho más simple con MaterialPropertyDrawers. Agregue la línea siguiente a la sección Propiedades del shader Personalizado/Redify:

[Toggle(REDIFY_ON)] _Redify("Red?", Int) = 0

y quite el:

CustomEditor "CustomShaderGUI"

También mire: MaterialPropertyDrawer

ShaderGUI debe usarse para soluciones GUI más complejas donde, e.g Las propiedades del material tienen dependencias entre sí o se desea un diseño especial. Usted puede combinar usando MaterialPropertyDrawers con las clases ShaderGUI, consulte StandardShaderGUI.cs.

Rendering con Shaders Remplazados
Utilizando Depth Textures (Texturas de profundidad)