Chango的数学Shader世界(十五)油画Shader-技术分析,教程纠错

本文旨在实现油画效果的后期Shader,分析并纠正教程中的技术错误。通过方向Kuwahara算法,解决了简单算法在边缘模糊的问题。讨论了Sobel梯度的误解,并解释了旋转矩阵在不同坐标系中的应用。此外,还探讨了优化方案和UE4自定义usf的使用方法。
摘要由CSDN通过智能技术生成

目的:

实现油画后期Shader,探究教程中技术细节,指出错误。

参考:

搜索ue4 paint filter。

UE4.21后整合自定义usf

观察:

油画的特点:成块的色块,但又保持清晰的边缘。

分析:

1.先来看一种比较“差”的油画实现

先看下外网上的一种简单油画算法。

注意这位大师是怎么处理木头纹理的。还有后边黑方块上的纹理是多么残缺。

有些边缘没有得到保留。(处理草倒是很好看,类比The Witness中的树叶处理)

章鱼脚的细节变得非常非常抽象

奇怪的蓝色(r=0,g=1,b=1)出现了。具体原因稍加思考就知,源码在下。

基本思路:

1.在以当前像素为中心的n*n核中,基于每个像素点对应的intensity(r+g+b),
对所有像素进行分级归纳(intensity=0,1,2,3....)

2.对于频次最高的intensity级,计算桶中所有像素平均值,作为结果
int TexIndex = 14;

 int intensityCount[10];
 float avgR[10];
 float avgG[10];
 float avgB[10];
 

 for (int iLevel = 0; iLevel < 10; iLevel++){
     intensityCount[iLevel] = 0;
     avgR[iLevel] = 0.0;
     avgG[iLevel] = 0.0;
     avgB[iLevel] = 0.0;
  }


 //COUNT INTENSITIES
 uv *= 0.5;
 for (int i = 0; i < radius; ++i)
 {
     int offsetI = -1 *(radius / 2) + i;
     float v = uv.y + offsetI * invSize.y;
     int temp = i * radius;
     for (int j = 0; j < radius; ++j)
    {
         int offsetJ = -(radius / 2) + j;
         float u = uv.x + offsetJ * invSize.x;
         float2 uvShifted = uv + float2(u, v);
         float3 tex = SceneTextureLookup(uvShifted, TexIndex, false);

        float curren
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值