UnityTips 之 在shader中将纹理当参数传递

简介: 好久没写 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 这个宏,或者 TEXTURE2DSAMPLER 这两个宏

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 如何调用其它文件内的函数

  1. 首先要需要在目标pass节点上将要调用的函数文件 inlcude 进来,这个比较简单。
  2. ASE 内有一个节点叫做 CustomExpression ,他除了直接写逻辑之外也可以调用函数,就是在写的逻辑里调用函数就可以了。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容