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.6. Propiedades para Texturas

Esta publicación está disponible en...

Estas propiedades nos permiten implementar texturas dentro de nuestro shader.

Si deseamos colocar una textura a nuestro objeto (e.g. un personaje 3D), entonces tendríamos que crear una propiedad 2D para su textura y luego pasarla a través de una función llamada “tex2D” la cual nos pedirá dos parámetros: la textura y las coordenadas UV de nuestro objeto.

Una propiedad que utilizaremos con frecuencia en nuestros videojuegos son los “Cube” que en sí se refiere a un “Cubemap”. Este tipo de textura es bastante útil para generar mapas de reflexión, e.g., reflejos en la armadura de nuestro personaje o para elementos metálicos en general.

Otro tipo de textura que podemos encontrar son aquellas de tipo 3D. Se utilizan con menor frecuencia que las anteriores dado que son volumétricas y poseen una coordenada más para su cálculo espacial.

Para declarar texturas en nuestro shader, la sintaxis es la siguiente:

// name (“display name”, 2D) = “defaultColorTexture”
// name (“display name”, Cube) = “defaultColorTexture”
// name (“display name”, 3D) = “defaultColorTexture”

Shader “InspectorPath / shaderName”
{
    Properties 
    {
        _MainTex (“Texture”, 2D) = “white” {}
        _Reflection (“Reflection”, Cube) = “black” {}
        _3DTexture (“3D Texture”, 3D) = “white” {}
    } 
}

Al momento de declarar una propiedad es de gran importancia considerar que ella estará escrita en lenguaje declarativo ShaderLab mientras que nuestro programa estará escrito ya sea en lenguaje Cg o HLSL. Al tratarse de dos lenguajes distintos tendremos que crear “variables de conexión”.

Estas variables se declaran de manera global utilizando la palabra “uniform”, sin embargo, este paso puede ser omitido debido a que el programa aun así las reconoce como variables globales. Entonces, para conectar una propiedad en un “.shader”, primero debemos declarar la propiedad en ShaderLab, luego la variable global utilizando el mismo nombre en Cg o HLSL, y finalmente podemos utilizarla.

Shader “InspectorPath / shaderName”
{
    Properties 
    {
    // declare properties
    _MainTex (“Texture”, 2D) = “white” {}    
    _Color (“Color”, Color) = (1, 1, 1, 1)    
    } 
    SubShader
    {
        Pass
        {
            CGPROGRAM
            ...
            // add connection variables
            sampler2D _Maintex;        
            float4 _Color;            
            ...
            half4 frag (v2f i) : SV_Target
            {
                // use
                half4 col = tex2D(_MainTex, i.uv);    
                return col * _Color;                
            }
            ENDCG
        }
    }
}

En el ejemplo anterior hemos declarado dos propiedades: _MainTex y _Color. Luego hemos creado dos variables de conexión dentro de nuestro CGPROGRAM, estas corresponden a “sampler2D _MainTex” y “float4 _Color”. Es fundamental que, tanto las propiedades como las variables de conexión posean el mismo nombre para que el programa pueda reconocerlas.

En la sección 2.3.5 detallaremos el funcionamiento de un sampler2D cuando hablemos sobre tipos de datos.

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.