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.1.6. Tags Render Type

Esta publicación está disponible en...

De acuerdo a la documentación oficial en Unity,

“Utilice el tag RenderType para sobreescribir el comportamiento de un shader”.

¿Qué quiere decir el enunciado anterior? Básicamente, con este Tag podemos pasar de un estado a otro, en el SubShader; agregando un efecto sobre todo material que coincida en una configuración (Type) determinada.

Para llevar a cabo su función necesitamos al menos dos shaders:

  1. Uno de reemplazo (color o efecto que deseamos agregar en tiempo de ejecución).
  2. Y otro a ser reemplazado (shader asignado al material).

Su sintaxis es la siguiente:

Tags { "RenderType"="type" }

Al igual que el Tags Queue; RenderType posee distintos valores configurables que varían según la tarea que se está llevando a cabo. Entre ellos podemos encontrar.

  • Opaque. Default.
  • Transparent.
  • TransparentCutout.
  • Background.
  • Overlay.
  • TreeOpaque.
  • TreeTransparentCutout.
  • TreeBillboard.
  • Grass.
  • GrassBillboard.

Por defecto, el tipo «Opaque» es establecido cada vez que creamos un nuevo shader. Así mismo, la mayoría de los built-in shaders en Unity vienen asignados con este valor dado que no poseen configuración para transparencias. No obstante podemos cambiar libremente esta categoría; todo dependerá del efecto que deseamos aplicar sobre una coincidencia.

Para entender el concepto a fondo haremos lo siguiente. En nuestro proyecto,

  1. Nos aseguraremos de crear algunos objetos 3D en la escena.
  2. Crearemos un script C# al cual llamaremos USBReplacementController.
  3. Luego crearemos un shader al cual llamaremos USB_replacement_shader.
  4. Finalmente crearemos un material al cual llamaremos USB_replaced_mat.

Utilizando Camera.SetReplacementShader, asignaremos un shader sobre el material USB_replaced_mat de manera dinámica. Para llevar a cabo la función, el shader del material deberá poseer un Tag RenderType igual al shader de reemplazo.

Para ejemplificar, asignaremos el shader Mobile/Unlit a USB_replaced_mat. Este built-in shader posee un Tag de tipo «RenderType» igual a «Opaque». Por consiguiente el shader USB_replacement_shader deberá coincidir el mismo RenderType para que la operación se lleve a cabo.

(Fig. 024. ( Se ha asignado el shader Unlit (Supports Lightmap) sobre el material USB_replaced_mat )

El script USBReplacementController debe ser asignado directamente a la cámara como un componente. Este controlador estará a cargo de reemplazar un shader por otro de reemplazo, siempre y cuando posean la misma configuración en el RenderType.

using System.Collection;
using System.Collections.Generic;
using UnityEngine;

[ExecuteInEditMode]
public class USBReplacementController : MonoBehaviour
{
    // replacement shader
    public Shader m_replacementShader;

    private void OnEnable()
    {
        if(m_replacementShader != null)
        {
            // the camera will replace all the shaders in the scene
            // whit the replacement one
            // the "RenderType" configuration must match in both
            // shader
            GetComponent<Camera>().SetReplacementShader.            (m_replacementShader,"RenderType");
        }
    }

    private void OnDisable()
    {
         // let's reset the default shader
         GetComponent<Camera>().ResetReplacementShader()
    }
}

Cabe mencionar que se ha definido la función [ExecuteInEditMode] sobre la clase. Esta propiedad nos va a permitir previsualizar cambios en modo de edición.

Utilizaremos a USB_replacement_shader como shader de reemplazo.

Como ya sabemos, cada vez que creamos un nuevo shader, este viene configurado con su RenderType igual a «Opaque». En consecuencia USB_replacement_shader podrá reemplazar el shader Unlit que hemos asignado al material previamente.
Para previsualizar los cambios de manera evidente, iremos al fragment shader stage de USB_replacement_shader y agregaremos un color rojo, el cual multiplicaremos por el color de salida.

fixed4 frag (v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);
    // add a red color
    fixed4 red = fixed4(1, 0, 0, 1);
    return col * red;
}

Debemos asegurarnos de incluir a USB_replacement_shader en la variable de reemplazo tipo Shader que se encuentra en el script USBReplacementController.

(Se ha asignado el script USBReplacementController a la cámara)

Y además, aquellos objetos que agregamos previamente en la escena, deben poseer el material USB_replaced_mat.

(Se ha asignado el material USB_replaced_mat a los objetos 3D; a un Quad, un cubo y una esfera)

Dado que la clase USBReplacementController tiene incluida las funciones OnEnable y OnDisable, si activamos o desactivamos el script, podremos ver como el built-in shader Unlit es reemplazado por USB_replacement_shader en modo de edición, aplicando un color rojo en el rendering.

(El built-in shader Unlit ha sido reemplazado por USB_replacement_shader en el rendering)

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.