首页 > 其他分享 >shader变体

shader变体

时间:2023-05-02 15:44:42浏览次数:46  
标签:multi COLOR shader Shader compile DEFAULT 变体

用法

以multi_compile为例:

Variant.shader

Shader "My/Variant/Variant"
{
    SubShader
    {
        //...

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile COLOR_DEFAULT COLOR_G

            //...

            v2f vert (appdata v)
            {
                //...
            }

            fixed4 frag (v2f i) : SV_Target
            {
#if defined(COLOR_DEFAULT)
                return fixed4(1, 0, 0, 1);
#elif defined(COLOR_G)
                return fixed4(0, 1, 0, 1);
#endif
            }
            ENDCG
        }
    }
}

 

大概原理

有点类似c/c++的条件编译,这个也是一个编译时特性。上面的文件经过shader编译器编译后,编译器会帮我们生成2个shader

1、Variant-COLOR_DEFAULT.shader

//其他代码省略...
fixed4 frag (v2f i) : SV_Target
{
    return fixed4(1, 0, 0, 1);
}

2、Variant-COLOR_G.shader

//其他代码省略...
fixed4 frag (v2f i) : SV_Target
{
    return fixed4(0, 1, 0, 1);
}

 

然后我们可以在c#中使用相关的api来控制使用哪个shader:

调用Shader.EnableKeyword("COLOR_DEFAULT")会使用Variant-COLOR_DEFAULT.shader

调用Shader.EnableKeyword("COLOR_G")会使用Variant-COLOR_G.shader

 

为什么要使用变体?

  • 减少if else这种条件判断带来的性能损耗
  • 将代码类似的多个shader合并成1个,减少维护成本

 

keyword的一些备忘

1) 默认第1个keyword开启

 

2) 只有1个keyword会开启

Shader.EnableKeyword("COLOR_DEFAULT");

Shader.EnableKeyword("COLOR_G");

上面的代码执行后:COLOR_DEFAULT会关掉,COLOR_G会开启

 

3) 必定有1个keyword会开启

Shader.DisableKeyword("COLOR_DEFAULT");

Shader.DisableKeyword("COLOR_G");

面的代码执行后:COLOR_DEFAULT开启  

shader Inspector面板来控制关键字

[KeywordEnum(DEFAULT, G)] _COLOR("Color", Float) = 0

 

其他特性

这边不做介绍了,网上很多教程

shader_feature 

multi_compile_local

shader_feature_local

#pragma skip_variants POINT POINT_COOKIE

 

参考

unity shader 变种(多重编译 multi_compile)_子胤的博客-CSDN博客

Unity shader中的multi_compile和shader_feature宏定义_ShawnWeasley的博客-CSDN博客

Unity Shader - 使用multi_compile对Shader渲染质量控制_keywordenum_Jave.Lin的博客-CSDN博客

Unity #pragma multi_compile说明 - 00000000O - 博客园 (cnblogs.com)

Unity Shader multi_compile&shader_feature 变体_shaderfeature_lvcoc的博客-CSDN博客

Unity - Manual: Making multiple shader program variants (unity3d.com)

 

标签:multi,COLOR,shader,Shader,compile,DEFAULT,变体
From: https://www.cnblogs.com/sailJs/p/17359407.html

相关文章

  • 噪音及其在shader中的应用
    噪声的发明起初是为了解决“非纯色不规则”纹理占用内存太大的问题。噪声可以实现“局部细微渐变,全局差别很大”的效果。随机数无法达到这样的效果,但用随机数可以生产白噪声,再用高斯模糊达到类似的效果。在图形学api中,噪声可以看出是一个函数,用于模糊在网格上生成的随机数。所有......
  • Bert变体--Roberta
    Roberta论文地址:https://arxiv.org/pdf/1907.11692.pdfStaticvs.DynamicMaskingRoberta使用动态Mask。Bert在预处理训练数据时,每个样本会进行一次随机的mask,后续的每个训练步都采用这次mask,实际上就是每个epoch是重复的,被称为静态mask。Roberta在预处理时没有进行mask,而是......
  • Unity Shader之自定义GUI
    可参考:https://zhuanlan.zhihu.com/p/384871087效果如下:转载请注明出处:https://www.cnblogs.com/jietian331/p/17296261.html......
  • reverse/base64变体类型
    例:【BUU】特殊的BASE64进入main函数后发现rightflag明显是base64加密的结果(补=)随后发现右base64encode函数进入后发现是传统的base64加密方式,猜测是密码表的变体利用shitf+f12查看字符串发现有类似密码表的字符串利用脚本进行解密importbase64outab="ABCDEFGHIJKLMNOP......
  • Unity Shader案例04-------透明
    Shader"CLF/SetTransparent"{Properties{_Diffuse("Diffuse",Color)=(1,1,1,1)//漫反射_MainTex("MainTex",2D)="white"{}//2......
  • Unity URP shader之镭射效果实现
    可参考:万物皆可镭射,个性吸睛的材质渲染技术镭射公式分享如下:1//此公式来源于:https://zhuanlan.zhihu.com/p/4872048432//HSV->RGB3half3HUEToRGB(halfh)......
  • 某些网上以及书籍中关于首次使用灰度shader出错时需要注意的点
    最近因为毕业设计,刚刚入门shader,找了本cocos2d-x的书看关于在cocos中运用shader的部分,网上也有人照着本书做相应的博客,但是使用他们的代码都会出现错误。书上的代码:......
  • Unity Shader 实现 Lambert Phong BlinnPhong
    1.Lambert模型基于Lambert余弦定理构造出的模型,只计算了漫反射部分代码部分解析可以看到Lambert模型中只返回了漫反射(diffuse) 再看一下di......
  • 如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智
    一些老的显卡设备没有更新驱动,甚至根本就不支持Vulkan的显卡,遇到静态链接的vulkan-1.lib文件,启动exe就会崩溃。 你以为从别的机器拷贝这个vulkan-1.dll就可以了吗?太傻......
  • Three.js自定义shader实现离相机越近越透明效果
    constcustomShader=newTHREE.ShaderMaterial({uniforms:{},defines:{nearDis:0.3},transparent:true,side:THREE.DoubleSide,vertexShader:......