通常,要在屏幕上绘制的输出中会有不止一种颜色。 组合两种颜色的一种简单方法是根据其他参数在它们之间进行插值。
本教程将基于简单的纹理着色器,但是您可以将该技术与包括表面着色器在内的任何着色器一起使用。
基于颜色的插值
我们实现着色器的第一个版本将基于值在两个纯色之间进行插值。 因此,我们现在不需要连接到uv坐标或纹理的变量,而是添加了第二个颜色变量和一个简单的值,该值将确定材质是否显示第一个或者第二个颜色。 我们将该混合属性定义为“范围”,以便在编辑器中获得一个不错的滑块。
//编辑器显示属性
Properties
{
_Color("Tint",Color) = (0,0,0,1)
_SecondaryColor("Secondary Color",Color) = (1,1,1,1)
_Blend("Blend Value",Range(0,1)) = 0 //0显示第一个颜色 1显示第二个
}
//两个颜色之间用来混合的值
float _Blend;
//纹理着色
fixed4 _Color;
fixed4 _SecondaryColor;
作为第一个版本,我们可以根据混合值将第二种颜色添加到第一种颜色中。
//片段着色器方法
fixed4 frag(v2f i):SV_TARGET
{
fixed4 col = _Color+_SecondaryColor*_Blend;
return col;
}
们已经可以看到颜色发生了变化,但没有更改为辅助颜色。 这是因为当考虑到辅助颜色时,主要颜色仍然存在(这类似于将两个不同颜色的光指向一个点)。为了解决这个问题,我们可以在增加混合值时减轻原色的影响。 混合值为0时,我们看不到任何第二色和所有的原色;混合值为1时,我们则看不到所有第二色,而看不到任何原色。 为了存档,我们将原色乘以1减去混合值,将1设为0,将0设为1。
//片段着色器方法
fixed4 frag(v2f i):SV_TARGET
{
fixed4 col = _Color*(1-_Blend)+_SecondaryColor*_Blend;
return col;
}
此过程也称为线性插值,并且hlsl内置了一个函数,称为lerp。 它需要一个值进行插值,要插值到的值以及一个插值。
//片段着色器方法
fixed4 frag(v2f i):SV_TARGET
{
fixed4 col = lerp(_Color,_SecondaryColor,_Blend);
return col;
}
完整的着色器如下
Shader "UnityShader/Blender_Color"{
//编辑器显示属性
Properties
{
_Color("Tint",Color) = (0,0,0,1)
_SecondaryColor("Secondary Color",Color) = (1,1,1,1)
_Blend("Blend Value",Range(0,1)) = 0 //0显示第一个颜色 1显示第二个
}
SubShader
{
//这个材质完全不透明 并且与其他不透明的几何体同时渲染
Tags{
"RenderType" = "Opaque"