简介: 好久没写 unity 相关的 Tips 了,主要是吧小技巧就那么多,可能越往后写这个相关题材的内容就更新的越慢了,应该是个正常现象。最近在做效果调试的时候,希望可以将 Texture 传递到函数中,这样类似多重采样这些代码就可以封装到一个函数里了。本文主要写两点,一是如何写接受 texture 的函数,二是用ASE 如何传Texture2D 参数
unity版本: 2022.3.55f1c1
管线: URP
可以接受纹理的函数
这个函数呢引擎官方已经有代码示例了,翻的少的人可能注意不到,我们就看一下 SampleNormal 这个函数就可以了
half3 SampleNormal(float2 uv, TEXTURE2D_PARAM(bumpMap, sampler_bumpMap), half scale = 1.0h)
{
#ifdef _NORMALMAP
half4 n = SAMPLE_TEXTURE2D(bumpMap, sampler_bumpMap, uv);
#if BUMP_SCALE_NOT_SUPPORTED
return UnpackNormal(n);
#else
return UnpackNormalScale(n, scale);
#endif
#else
return half3(0.0h, 0.0h, 1.0h);
#endif
}
可以看到这里的 TEXTURE2D_PARAM(bumpMap,sampler_bumpMap) 就是可以接受纹理的参数。我们看一下这个宏的定义
#define TEXTURE2D_PARAM(textureName, samplerName) TEXTURE2D(textureName), SAMPLER(samplerName)
它等价于定义了 TEXTRUE2D() 和 SAMPLER() 两个宏
所以现在就明了了,如果我们需要传递纹理和sampler呢,我们可以使用TEXTURE2D_PARAM 这个宏,或者 TEXTURE2D 和 SAMPLER 这两个宏
OK 接受纹理参数的函数已经分析完了,我们来看一下用 ASE 向可接收纹理参数的函数如何传递纹理
ASE 中向函数传递 TEXTURE2D 参数
首先呢,我们一般在 ASE 中都是直接采样纹理,所以 TextrueSample 节点用的比较多,但是呢,它的输出结果是采样好的颜色值。无法满足我们传 TEXTURE2D 的需求
聪明的朋友可能想到了,ASE 还有一个纹理节点叫 Texture Object 这个节点可以输出一个 Sampler 和一个 SampleState,我们可以尝试将这个Sampler 节点传递到我们的函数中,这时候一般人可能会遇到报错,提示无法将 sampler2D 转换到 Texture2D<float4>,如果你没遇到,那你肯定不是一般人。这是怎么回事呢,看一下生成的代码便可知道,生成代码里纹理的声明就是 sampler2D ,而这个 sampler2D 它不是一个宏,并没有说会间接声明 Texture2D。这怎么搞呢。
在 ASE 的主属性面板上,就是给 shader 命名,选模版的那个属性面板,在精度设置选项下方,勾选上 Use Sampling Mac,再生成代码即可,这时候再看代码,会发现纹理的定义方式变成了 TEXTURE2D() 和 SAMPLER() 的样式,这样就可以将我们的纹理以参数的形式传递到函数中了。
ASE 如何调用其它文件内的函数
- 首先要需要在目标pass节点上将要调用的函数文件 inlcude 进来,这个比较简单。
- ASE 内有一个节点叫做 CustomExpression ,他除了直接写逻辑之外也可以调用函数,就是在写的逻辑里调用函数就可以了。