原文:【HLSL学习笔记】WPF Shader Effect Library算法解读之[Embossed]
Embossed(浮雕效果)
浮雕效果主要有两个参数:Amount和Width。Amount控制浮雕边缘的对比度,Width参数控制浮雕效果的精细程度,数值越小越精细。
效果如下图所示:
源代码如下:
+++++++++++++++++++++++++++++++++++++++++++++
//浮雕特效
//数量,一个控制雕刻边缘对比度的参数,数值越大,对比越强
float Amount : register(C0);
//位移,一个用于控制雕刻效果宽度的参数,数值越小,雕刻效果越细腻、清晰
float Width : register(C1);
sampler2D implicitInputSampler : register(S0);
float4 main(float2 uv : TEXCOORD) : COLOR
{
//用一个中性灰不透明的纹理当做默认的纹理
float4 outC = {0.5, 0.5, 0.5, 1.0};
//通过两次正反的位置偏移叠加产生边缘错位的效果,可以用Amount参数来控制错位的边缘对比度
outC -= tex2D(implicitInputSampler, uv - Width) * Amount;
outC += tex2D(implicitInputSampler, uv + Width) * Amount;
//上面的纹理叠加难免会产生色彩混合后不等于中性灰的地方,所以再将纹理变成灰度
outC.rgb = (outC.r + outC.g + outC.b) / 3.0f;
return outC;
}
+++++++++++++++++++++++++++++++++++++++++++++
这个特效中主要是利用中性灰色来区分高光边缘和暗部边缘,通过对纹理进行错位来突出纹理的边缘,通过数量值来控制高光和暗部的对比。
这种多次采样并叠加的方式就类似于Photoshop中的图层混合模式,下面简单做几个PS中默认的混合模式特效:
1、 正片叠底Multiply
算法:C=A*B
代码:
+++++++++++++++++++
float4 c;
c=tex2D(input,uv);
c*=tex2D(input,uv);
return c;
+++++++++++++++++++
效果:
1、 滤色Screen
算法:C=1-(1-A)*(1-B)
代码:
+++++++++++++
c=tex2D(input,uv);
c=1-(1-c)*(1-c);
+++++++++++++
效果: