En los programas de edición de fotos es muy común los modificadores de color como el brillo, saturación y contraste, esta vez aprenderemos a aplicar lo mismo en nuestros efectos de imagen, al igual que el efecto aprendido en el blog anterior, este consta de 3 ecuaciones simples.
Debo advertir que este efecto en particular realmente no tiene un uso práctico en videojuegos, porque normalmente las texturas ya vienen modificadas desde algún programa de edición de fotos, no hace falta volver a retocarlas en tiempo real consumiendo cálculos que podrían ser mas útiles en otros menesteres.
Pero de todos modos lo analizaremos para ver que hay de fondo y quizás le vea una utilidad mayor.
Shader "Mobile Friendly/Image FX/Brightness Saturation Contrast" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BrightnessAmount("Brightness Amount", Range(0,1)) = 0.5
_SaturationAmount("Saturation Amount", Range(0,1)) = 0.5
_ContrastAmount("Contrast Amount", Range(0,1)) = 0.5 }
SubShader {
Pass{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
#include "IFX.cginc"
uniform sampler2D _MainTex;
fixed _BrightnessAmount,_SaturationAmount,_ContrastAmount;
fixed4 frag(v2f_img i) : COLOR {
fixed4 source = tex2D(_MainTex, i.uv);
fixed3 luminosity = ContrastSaturationBrightness(source,_BrightnessAmount,_SaturationAmount,_ContrastAmount);
return fixed4(luminosity,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
Como vemos este shader es casi idéntico al que presenté la semana pasada, la única diferencia son las variables de brillo contraste y saturación y una función especial que he hecho que esta incluido dentro del archivo "IFX.cginc".
La función de #ContrastSaturationBrightness que esta contenida dentro del cg include
fixed3 ContrastSaturationBrightness(fixed3 color, fixed brt, fixed sat, fixed con) {
// Operacion para el brillo
fixed3 brtColor = color * brt;
//Operacion para saturacion
fixed intensityf = Luminance(brtColor);
fixed3 satColor = lerp(intensityf, brtColor, sat);
//Operacion para contraste
fixed3 avgLum = fixed3(0.5, 0.5, 0.5);
fixed3 conColor = lerp(avgLum, satColor, con);
return conColor;
}
La función te pide 4 parámetros, un color base que seria la textura que envía la cámara, y los tres siguientes que son el brillo, la saturación y el contraste.
La operación de la aplicación del brillo es simple, solo es multiplicar el color * el valor del brillo.
Para obtener la saturación es exactamente como se hizo en el blog pasado, es tomar el color y usar la función por defecto de Luminancia que trae unity que internamente es un producto punto entre color y un coeficiente. Ve a mi blog anterior para entenderlo a profundidad.
La ultima operación es la del contraste que es solo una interpolación del color por 0.5 que es un gris mas neutro.
Como se puede comprobar, no son cálculos muy complejos, de hecho son bastante simples, los hemos usado en varias oportunidades de manera involuntaria quizás.
De momento eso es todo por el momento, nos vemos en el próximo blog donde explicaré el paso de un sistemas de color como el HSV.
No siendo mas, nos vemos en un próximo Blog.
Comments