阿赵的Unity可视化Shader工具ASE介绍目录
大家好,我是阿赵。
之前介绍过一些ASE的用法,发现漏了一个比较重要的,自定义函数的使用。这里补充一下。
一、 使用的场合
在使用ASE制作Shader的过程中,可能会遇到以下这些情况:
- 有些处理方式,写代码几行就搞定,但如果使用节点连接,反而很复杂
- 有些算法比较复杂,不知道怎样在ASE里面通过节点连出来。
简单一句话概括,就是遇到写代码比连节点更简单的时候,我们会像能不能在ASE连节点的基础上,单独某个部分自己写代码?
答案是可以的。ASE提供了一种节点,叫做Custom Expression节点。
这种节点可以自定义输入输出的参数内容,然后自己写代码实现。
二、 举例说明
这里我举一个简单的均值模糊的例子。
均值模糊的算法很简单,只需要把当前像素点附近一定范围内的所有像素点采样一次,把色值加起来再除以像素点数量,求得一个平均的像素颜色,再赋予给原来的像素就行。
如果是写代码,其实实现起来很简单,输入一个模糊的半径radius,然后那当前像素点的uv,然后写2重循环,对uv做偏移,对图片采样,把色值加起来,再求平均值。
如果写成代码就是这样:
float3 AvargeBlurFun( sampler2D tex, float2 uv, int radius)
{float r = 0;float g = 0;float b = 0;float count = radius*2+1;count = count*count;for(int i = -radius;i<radius+1;i++){for(int j = -radius;j<radius+1;j++){float2 uvTemp = uv + float2(_MainTex_TexelSize.x*i,_MainTex_TexelSize.y*j);float4 colPixel = tex2D(tex,uvTemp);r = r+colPixel.x;g = g+colPixel.y;b = b+colPixel.z; }}r = r/count;g=g/count;b=b/count;return float3(r,g,b);
}
这个代码如果用ASE来连接,其实我也不知道怎样连,因为没找到循环的节点。我看到过其他人用ASE实现这个模糊的算法,只能写死采样像素点附近的8个点采样,加上本身的像素点,再做平均。
所以这时候就需要用到自定义函数的Custom Expression节点。
先来分析一下,这个求均值的函数,需要的参数有:
1. 一个sampler2D的贴图
2. 该贴图对应的uv坐标
3. 模糊的半径
4. 由于_MainTex_TexelSize在没有定义之前是不能用的,而ASE有节点可以获取_MainTex_TexelSize,所以_MainTex_TexelSize也最好传进去。
于是我们需要先新建一个Custom Expression节点,改一下名字:
然后由于我们需要输出的是一个rgb值,所以把输出类型改成float3
接下来新增刚才说的4个传入参数:
在Inputs里面找到第一个参数,修改类型为sampler2D,然后把名字改成tex:
接下来点加号,继续添加其他几个输入的参数:
然后把其他几个参数的名字和类型修改好
这时候,这个自定义节点会变成这样:
接下来把代码复制到Code框里面:
float r = 0;
float g = 0;
float b = 0;
float count = radius*2+1;
count = count*count;
for(int i = -radius;i<radius+1;i++)
{for(int j = -radius;j<radius+1;j++){float2 uvTemp = uv + float2(texelSize.x*i,texelSize.y*j);float4 colPixel = tex2D(tex,uvTemp);r = r+colPixel.x;g = g+colPixel.y;b = b+colPixel.z; }
}
r = r/count;
g=g/count;
b=b/count;
return float3(r,g,b);
最后把输入输出的参数连接好:
这时候材质球上已经显示出了参数:
把材质球赋予给模型,调节radius半径参数,就会出现均值模糊的效果了: