Unity3D油画滤镜shader的实现

原图
在这里插入图片描述
添加后处理效果后
在这里插入图片描述
实现思路是对每一个像素点,采样它周围的四块矩形区域的均值,并选取各像素颜色分量色差最小的均值作为该像素点的颜色。从而既可以达到一种模糊效果,又可以对画面进行柔化。
(中间的是像素着色器当前要执行的像素,每个像素需要采样1234四个区域)
在这里插入图片描述

具体的计算过程是先计算该像素点周围四块矩形每个矩形区域内的所有像素颜色的均值的平方,接着计算所有像素颜色的平方的均值。然后求差值,那么什么时候这两个值差距最小呢?大家可以列式计算一下,推导也比较复杂,结果就是这一块区域内每个像素的颜色互相更接近的时候。因此比较四块区域的这个差值,选取差值最小的一块作为最后的像素颜色,这样就同时完成了模糊和柔化的效果,也就模拟了油画的效果。
如果用数学语言说的话,那么就是输出多个子区域中颜色方差最小的子区域的颜色均值

完整代码

c#代码

namespace Colorful
{
   
    using UnityEngine;


    [ExecuteInEditMode]
    public class OilPaint : MonoBehaviour
    {
   
        public int Radius = 3;

        public Shader shader;

        protected void OnRenderImage(RenderTexture source, RenderTexture destination)
        {
   
            Material material = new Material(shader);
            material.SetInt("_Radius", Radius);
            material.SetVector("_PSize", new Vector2(1f / (float) source.width, 1f / (float) source.height));

            Graphics.Blit(source, destination, material);
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值