【Unity3D Shader】学习笔记-渐变映射①
引言
Gradient-Map(渐变映射)常用于Color Gradient颜色分级、颜色校正等。本篇主要用于将图像中的灰度范围映射到指定的渐变填充色中,通过渐变映射图来制作不同的效果。
[声明:本笔记系列文章的图片资源都源自百度图片搜索,如有问题联系我]
一、针对场景的后处理效果
图1 原场景效果
图2 渐变映射效果1
图2 渐变映射效果2
二、直接对图片进行处理
图1 原图
图2 渐变映射效果
三、效果的处理步骤
1. 获取原纹理的灰度值(下面给了2种计算灰度值的方法)
// 通过RGB三通道的平均值计算获得灰度值 float gray_value = (col.r + col.g + col.b) / 3; // 心理学灰值 float gray_value = dot(col.rgb, fixed3(0.299, 0.587, 0.114));
2. 根据灰度值采样Gradient Map纹理。
// 通过灰度值采样纹理映射纹理 fixed4 gradient = tex2D(_GradientMap, gray_value);
3. 将新获得的渐变颜色和原颜色值进行混合计算。
// 直接根据alpha值进行插值 gradient.rgb = lerp(col.rgb, gradient.rgb, gradient.a);
通过修改不同的渐变映射纹理就可以获得不同的效果,好的的效果就需要根据场景制作特定的映射纹理进行调效果,Shader代码相对简单,在片段着色器中进行效果处理,具体代码如下:
fixed4 col = tex2D(_MainTex, i.uv); // 通过RGB三通道的平均值计算获得灰度值 float gray_value = (col.r + col.g + col.b) / 3; // 加上强度控制 gray_value *= _Intensity; // 通过灰度值采样纹理映射纹理 fixed4 gradient = tex2D(_GradientMap, gray_value); // 根据渐变纹理的透明度进行插值。 gradient = lerp(col, gradient, gradient.a); // 这里影响了alpha return gradient;