简介: 在搬砖的过程中,难免会遇到美术不停地提功能需求,有一部分类型的需求可能需要一些遮罩图来进行实现,当这种需求多的时候,很容易导致我们一个着色器上采样纹理数量超过16个,平常的写法出现16个纹理采样的时候,shader编译的时候就会报错了,我们来看一个小妙招。当然这个我是在 windows平台下的 dx11 来测试的,通过下图的报错也可看出来,至于其它平台,应该也是类似的
unity版本: 2022.3.14
管线:URP
报错
当我们在一个着色器中像平时一样使用16个采样器时就会报下面的错,注意,这里指15个纹理采样不会报错,16个纹理采样就会报错
纹理采样过多引起的编译报错
这个报错也提示了我们,sampler的 register的数量超过了索引数16
官方文档中有写到 DX11 支持最多 128 张纹理和 16 个 sampler
分析
我们来看一下代码里面的声明
16个纹理属性 常规声明状态下对应的 16个 sampler
我们看一下 sampler2D 做了啥
官方文档详细说明
sampler2D, sampler3D, samplerCUBE 其实同时定义了 texture 和 Sampler 对,这种方式也是我们日常使用的方式,至于平台兼容啥的都是引擎自动处理的,这种写法比较简单,通用性也强。
其中的 sampler 就包含了我们纹理采样的 循环模式,过滤模式,各向异性过滤模式,这个正好是和纹理的导入设置相对应的
当然我们也可以自己分开来定义,unity也为我们提供了宏。我们来看一下分开声明后的代码,这里我们通过宏声明20个纹理属性,但是只声明一个 sampler
我们使用 SAMPLE_TEXUTRE2D(texutre,sampler,uv) 来进行采样,这一下20个纹理也没有编译报错。
当然 sampler 包含了我们纹理采样的 WrapMode,FilterMode,AnisoFiltering,所以只有上面三个参数一样的纹理才可以公用 sampler,不然效果会错的哦!!
网友评论