目的:
实现油画后期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