07_增加MatCap

添加MatCap

贴图

B通道是MatCap的Mask 这里有3张MatCap,分别对应是高光,金属,丝袜 先把贴图上上

读取MatCapMask

初始化 采样

添加参数

MatCap宏开关和贴图 MatCap的基础混色,混合颜色强度强度,混合Alpha程度 反射开关,这里没有设置宏,仅为开关,在后面声明之后当Float(Bool)用就行。还有深度值,用于计算折射 混合模式设置,UV偏移 声明

计算MatCap

获取MatCapMask

采样获得MatCapMask,在贴图的B通道中

计算UV

采样matCap的固定公式,将法线转换到观察空间,取XY作为UV进行采样,这里因为原本法线是-1~1,这里需要重映射到0~1

折射判断

对需要折射的部分进行判断,这里其实是直接根据折射开关的值来的,因为只有0和1的bool值

折射系数及UV调整

这里并非是真的计算折射,其实只是对MatCap采样进行缩放和平移调整。 获取各个区域不同的UV和Depth参数进行混合,调整matCapUV param.xy * input.uv是表示物体UV方向的偏移(为了保证效果贴合物体本身UV),但为了整体控制偏移也使用了+ param.zw

采样MatCap和混合参数

混合模式

这里是三种混合方式 乘法混合(Multiply Alpha Blend) 这里先计算Alpha的值,blendColor就是MatCap采样颜色乘上基础混合颜色和Matcap颜色总强度,最后是使用alpha进行插值 从效果来说,乘法会使颜色变暗,而使用alpha混合,输出部分就全部是Matcap颜色或全是基础颜色,两者是不会有重叠的

1
2
3
4
5
6
7
 //乘法Alpha混合
if(blendMode == 0)
{
    float alpha = saturate(alphaBurst * mask);
    float3 blendColor = tintColor * matCapColor * colorBurst;
    matCapColor = lerp(baseCol, blendColor, alpha);
}

加法混合(Additive Blend) 同样先计算Alpha,几个混合模式中Alpha是一样的。这里是先是使用乘法混合matcap颜色和相关系数,最后是加法混合,使用原本颜色加上matcap颜色 效果来说就,在最后一步加法混合时,原颜色并没有剔除掉Alpha中部分,所以在alpha区域两个颜色相加就会变亮

1
2
3
4
5
6
7
//加法混合
else if(blendMode == 1)
{
    float alpha = saturate(alphaBurst * mask);
    float3 blendColor = tintColor * matCapColor * colorBurst;
    matCapColor = baseCol + blendColor * alpha;
}

叠加混合(Overlay Blend) 公式一:对比度调整 公式二:叠加混合 先对matcap的blendColor进行处理,-0.5就是原本颜色范围变成-0.5~0.5以0.5为中心环绕,这时这个值作为一个基数在乘上颜色强度就得到了一个降低暗部增强亮部的系数,最后加上原本的matcapColor,相当于以matcapColor增强对比度 为了防止前面的颜色对比度过高失真所以使用一个中性灰色0.5进行平滑 以0.5为边界用来区分高亮区域和阴影区域,高于0.5就增强,低于0.5就削弱,效果来可以理解为增加对比度

1
2
3
4
5
6
7
8
//叠加混合
else if(blendMode == 2)
{
    float alpha = saturate(alphaBurst * mask);
    float3 blendColor = saturate((matCapColor * tintColor - 0.5) * colorBurst + matCapColor *  tintColor);
    blendColor = lerp(0.5, blendColor, alpha);
    matCapColor = lerp(blendColor * baseCol * 2, 1 - 2 * (1 - baseCol) * (1 - blendColor), baseCol >= 0.5);
}

面板matcap参数调整

饰品手臂部分

MatCapTintColor5:E0C8BF 第5个槽位是丝袜的材质,所以进行染色和开启反射,这里取消他的偏移,使它不按照物体UV进行偏移反射

衣服身体部分

第5个槽的Matcap不生效是正常的,原本是对应的裙摆,但mask里没有。 颜色MatCapTintColor2:DBE4F8,MatCapTintColor5:D9E6EC

当前效果


Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • URP - RendererFeature :ScreenSpaceOutline
  • 平滑法线处理 - 八面体映射
  • Lv.3 Unity主线:一个简单的PBRShader
  • 理论支线:直接光漫反射与GGX高光的混合问题
  • 理论支线:PBR - 基于图像的照明( image based lighting-IBL)
  • # #