unityshader 笔触
时间: 2025-01-19 20:00:20 浏览: 51
### Unity 中使用 Shader 实现笔触效果
#### 色调和饱和度调整
为了创建具有艺术感的笔触效果,首先需要对输入图像的颜色属性进行预处理。这一步骤涉及调整色调和降低色彩饱和度,使得画面呈现出更加素雅的艺术风格[^1]。
```csharp
// HLSL代码片段用于修改颜色属性
half4 color = tex2D(_MainTex, i.uv);
color.rgb = Luminance(color.rgb); // 将彩色转换成灰阶
```
#### 模糊与边缘检测
接着通过应用高斯模糊或其他类型的滤镜来柔化整个场景,并突出显示重要轮廓线的位置。对于水墨画来说,合理的边缘增强可以模仿宣纸上的墨迹扩散现象。
```glsl
float edgeThresholdMin = 0.3;
float edgeThresholdMax = 0.7;
fixed4 frag(v2f_img i) : SV_Target {
float2 uv = i.uv;
half3 normalOffset = normalize(float3(
tex2D(_BumpMap, uv + fixed2(1, 0)).r - tex2D(_BumpMap, uv - fixed2(1, 0)).r,
tex2D(_BumpMap, uv + fixed2(0, 1)).g - tex2D(_BumpMap, uv - fixed2(0, 1)).g,
1));
half edgeFactor = saturate(dot(normalize(half3(0, 0, 1)), normalOffset));
return lerp(tex2D(_MainTex, uv), _EdgeColor, smoothstep(edgeThresholdMin, edgeThresholdMax, edgeFactor));
}
```
#### 笔触绘制仿真
最后,在上述基础上进一步引入实际的手绘纹理或图案作为遮罩层叠加到目标表面上。利用透明度混合技术以及基于光照强度变化而改变颜色过渡的方式能够很好地再现类似于Photoshop中的厚涂技法[^2]。
```hlsl
sampler2D _BrushTexture; // 自定义笔刷纹理资源路径
void surf(Input IN, inout SurfaceOutputStandard o){
fixed4 brushCol = tex2D(_BrushTexture, IN.uv_MainTex);
// Lambert计算得到表面法向量与光源方向之间的夹角余弦值范围[-1,+1],再映射至[0,1]
float NdotL = dot(o.Normal, _WorldSpaceLightPos0.xyz)*0.5+0.5;
// 使用NdotL控制两种颜色间的插值比例从而达到不同压力下的着色差异
o.Albedo = lerp(_BaseColor, _HighlightColor, pow(NdotL, _Softness))*brushCol.a;
}
```
阅读全文
相关推荐

















