阿赵的Unity可视化Shader工具ASE介绍目录
  大家好,我是阿赵。
  之前介绍过一些ASE的用法,发现漏了一个比较重要的,自定义函数的使用。这里补充一下。

一、 使用的场合

  在使用ASE制作Shader的过程中,可能会遇到以下这些情况:

  1. 有些处理方式,写代码几行就搞定,但如果使用节点连接,反而很复杂
  2. 有些算法比较复杂,不知道怎样在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半径参数,就会出现均值模糊的效果了:
在这里插入图片描述

在这里插入图片描述

Logo

分享前沿Unity技术干货和开发经验,精彩的Unity活动和社区相关信息

更多推荐