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

4.0.2. Nuestro primer shader en Cg o HLSL

Esta publicación está disponible en...

Continuaremos trabajando con nuestro shader “USB_simple_color” que creamos al inicio de este capítulo.

Como ya sabemos nuestro shader por defecto posee una textura llamada _MainTex la cual se encuentra configurada en las propiedades. Lo que haremos a continuación será agregar color para cambiar el tinte de la textura.

Antes de comenzar, debemos recordar que no podemos aplicar directamente un shader sobre un objeto en nuestra escena. Para ello necesitamos crear un material y asignar el shader para que pueda ser procesado gráficamente. Para crear un material debemos ir a nuestro proyecto, presionar clic derecho sobre la carpeta en la que estamos trabajando, ir a Create y seleccionar Material. Dependiendo del rendering pipeline será la configuración por defecto que posea el material que acabamos de crear. Generalmente, cuando creamos un material en Built-in RP trae consigo un shader tipo Standard Surface el cual nos permite visualizar la dirección de iluminación, sombras y otros cálculos asociados al mismo.

Entonces, vamos a la jerarquía y creamos un objeto 3D. Asignamos el shader USB_simple_color al material que hemos creado recientemente y luego aplicamos el material al objeto en nuestra escena. En este punto podemos asignar una textura a nuestro material para que sea proyectado sobre el objeto.

Volvemos a nuestro shader USB_simple_color y creamos una propiedad de “color” como veremos en el siguiente ejemplo:

Shader “USB / USB_simple_color”
{
    Properties
    {
        _MainTex (“Texture”, 2D) = “white” {}
        _Color (“Texture Color”, Color) = (1, 1, 1, 1)
    }
    SubShader {} ...
}

Lo que acabamos de hacer fue declarar una propiedad de color para nuestro shader. Si guardamos y volvemos a Unity podemos ver que esta propiedad aparece en el Inspector del material, sin embargo, aún no está funcionando dado que no la hemos declarado dentro del CGPROGRAM. Lo que debemos hacer a continuación es agregar la variable de conexión de _Color para que podamos utilizarla dentro del programa. Para ello nos posicionamos sobre el vertex shader stage; donde _MainTex ha sido declarada como sampler2D y creamos la variable de conexión de la siguiente mantera:

uniform sampler2D _Maintex;
uniform float4 _MainTex_ST;
uniform float4 _Color;        // connection variable. 

Como podemos ver, hemos declarado una variable global para _Color dentro de nuestro CGPROGRAM o HLSLPROGRAM, sin embargo, aún no la estamos utilizando. Para cambiar el tinte de nuestra textura iremos al fragment shader stage y multiplicaremos col (color de la textura) por _Color utilizando el signo de multiplicación. La operación debe verse de la siguiente manera:

CGPROGRAM
fixed4 frag (v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);
    return col * _Color;
}

HLSLPROGRAM
half4 frag (v2f i) : SV_Target
{
    half4 col = tex2D(_MainTex, i.uv);
    return col * _Color;
}

Si guardamos nuestro shader y volvemos a Unity, ahora podremos cambiar el tinte de la textura desde el inspector del material.

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.