美文网首页
UnityTips 之大批量的纹理采样操作

UnityTips 之大批量的纹理采样操作

作者: 暴走TA | 来源:发表于2024-01-23 11:08 被阅读0次

    简介: 在搬砖的过程中,难免会遇到美术不停地提功能需求,有一部分类型的需求可能需要一些遮罩图来进行实现,当这种需求多的时候,很容易导致我们一个着色器上采样纹理数量超过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

    20个纹理声明 纹理的采样

    我们使用 SAMPLE_TEXUTRE2D(texutre,sampler,uv) 来进行采样,这一下20个纹理也没有编译报错。
    当然 sampler 包含了我们纹理采样的 WrapMode,FilterMode,AnisoFiltering,所以只有上面三个参数一样的纹理才可以公用 sampler,不然效果会错的哦!!

    相关文章

      网友评论

          本文标题:UnityTips 之大批量的纹理采样操作

          本文链接:https://www.haomeiwen.com/subject/cebuodtx.html