En Unity, los shaders se programan principalmente usando HLSL (High-Level Shading Language), aunque también se utilizan estructuras específicas de Unity como ShaderLab para definir propiedades y configuraciones. A continuación, te explico los detalles:
1. HLSL (High-Level Shading Language)
2. ShaderLab
HLSLPROGRAM
/ENDHLSL
.
3. Cg (Deprecated)
Un shader en Unity se divide en bloques definidos por ShaderLab, con código HLSL incrustado. Aquí un ejemplo básico:
Shader "Custom/MiShader" // Ruta/nombre del shader en el editor
{
Properties // Propiedades editables en el Inspector
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Textura", 2D) = "white" {}
}
SubShader // Bloque para configurar el renderizado
{
Tags { "RenderType" = "Opaque" } // Etiquetas de renderizado
Pass // Un "paso" de renderizado (ej: un efecto)
{
CGPROGRAM // Antiguamente se usaba CGPROGRAM, ahora HLSLPROGRAM
#pragma vertex vert // Define la función del vértice
#pragma fragment frag // Define la función del fragmento
#include "UnityCG.cginc" // Incluye funciones útiles de Unity
// Variables desde Properties
float4 _Color;
sampler2D _MainTex;
// Estructuras de datos para vértices y fragmentos
struct appdata // Entrada del vértice
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f // Salida del vértice → Entrada del fragmento
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
// Vertex Shader: Transforma vértices al espacio de pantalla
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); // Convierte a coordenadas de pantalla
o.uv = v.uv;
return o;
}
// Fragment Shader: Calcula el color de cada píxel
float4 frag (v2f i) : SV_Target
{
float4 texColor = tex2D(_MainTex, i.uv); // Muestra la textura
return texColor * _Color; // Aplica el color
}
ENDCG // Fin del bloque HLSL/CG
}
}
}
1. Properties
_Nombre ("Etiqueta", Tipo) = ValorPorDefecto
.
2. SubShader
Pass
es una ejecución de renderizado).
SubShader
para diferentes niveles de hardware.
3. Pass
Pass
ejecuta un conjunto de operaciones de renderizado.
vert
(vertex shader) y frag
(fragment shader).
4. Structs (appdata y v2f)
appdata
: Datos de entrada del vértice (posición, UVs, normales, etc.).
v2f
: Datos interpolados que pasan del vertex al fragment shader.
5. Funciones HLSL
vert
): Transforma vértices al espacio de pantalla (SV_POSITION
).
frag
): Calcula el color final del píxel (SV_Target
).
1. Vertex-Fragment Shaders
2. Surface Shaders
#pragma surface surf Lambert
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _Color.rgb;
}
3. Shader Graph
Jorge García
Fullstack developer