首页 > 其他分享 >Unity Shader Toggle KeywordEnum Enum 使用

Unity Shader Toggle KeywordEnum Enum 使用

时间:2023-05-09 15:26:02浏览次数:35  
标签:material uv KeywordEnum fixed4 INVERT Enum Toggle MainTex

Shader "Unlit/Custom/Shader05"
{
    Properties
    {
        _MainTex("MainTex",2D) = "white"{}
        [Toggle] _INVERT ("Invert color?", Float) = 0 // _INVERT 必须是大写的 _Invert 不可以 
        [KeywordEnum(None, Add, Multiply)] _Overlay ("Overlay mode", Float) = 0
        [Enum(ON, 0, OFF, 1)] _Enum("Test Enum", float) = 1
    }

    SubShader
    {
        Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                sampler2D _MainTex;
                #pragma shader_feature _INVERT_ON
                struct AppData
                {
                    float4 position:POSITION;
                    float2 uv:TEXCOORD0;
                };

                struct V2f
                {
                    float4 position:POSITION;
                    float2 uv:TEXCOORD0;
                };

                V2f vert(AppData appdata)
                {
                    V2f o;
                    o.position = UnityObjectToClipPos(appdata.position);
                    o.uv = appdata.uv;
                    return o;
                }

                fixed4 frag(V2f i):SV_Target
                {
                    fixed4 col = tex2D(_MainTex,i.uv);
                    

                    #ifdef _INVERT_ON
                        return fixed4(1,1,0,1);    
                    #else
                        return fixed4(1,0,0,1); 
                    #endif

                }
                ENDCG
            }
    }    
}

在材质面板就有一个toggle 的选框

 也可以使用C# 代码控制 这个是关键字,而不是变量 

        if (Input.GetKeyUp(KeyCode.A))
        {
            //GetComponent<Renderer>().material.SetFloat("_INVERT_ON",1); 这个无效
            GetComponent<Renderer>().material.EnableKeyword("_INVERT_ON");
        }
        
        if (Input.GetKeyUp(KeyCode.D))
        {
            //GetComponent<Renderer>().material.SetFloat("_INVERT_ON",0);
            GetComponent<Renderer>().material.DisableKeyword("_INVERT_ON");
        }

参考网页

https://zhuanlan.zhihu.com/p/552155864

https://blog.csdn.net/qq_33789001/article/details/124102179

https://zhuanlan.zhihu.com/p/93194054

https://blog.csdn.net/qq_43718731/article/details/127104592?spm=1001.2014.3001.5502

标签:material,uv,KeywordEnum,fixed4,INVERT,Enum,Toggle,MainTex
From: https://www.cnblogs.com/unity-android-ios/p/17385096.html

相关文章

  • EnumDesc方法
    usingSystem;usingSystem.ComponentModel;publicstringEnumDesc(Typetype,intvalue){stringname=Enum.GetName(type,value);if(name==null){returnstring.Empty;}......
  • Python中列表遍历使用range和enumerate的区别
    导读这篇文章主要介绍了Python中列表遍历使用range和enumerate的区别,在Python编程语言中,遍历list有range和enumerate方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下前言两者的比较只是编程实现上的差异,请不要......
  • web前端pdf.js预览pdf实例创建报错:Array. prototype` contains unexpected enumerable
    使用pdf.min.js是预览pdf文件,但是在实例化时异常报错,下面是实例化的代码varloadingTask=window.pdfjsLib.getDocument(url);console.log(loadingTask);this.pageNum=1;this.pageRendering=false;this.pageNumPending=null;loadingTask.promise.then((pdfDoc_)=>......
  • [python] Python枚举模块enum总结
    枚举是一种数据类型,在编程中用于表示一组相关的常量。枚举中的每个常量都有一个名称和一个对应的值,可以用于增强代码的可读性和可维护性。在Python中,枚举是由enum模块提供的,而不是Python提供专用的枚举语法。关于enum模块介绍见:enum。如需详细了解Python的enum模块,参见文章:Python......
  • dnsenum
    1、介绍dnsenum是一款非常强大的 域名信息收集工具,它是由参与backtrack 开发项目的程序员所设计,设计者名叫Fillp(barbsie)Waeythens,该名开发者是一个精通web渗透测试的安全人员,并对DNS信息收集有着非常丰富的经验。kali默认安装。dnsenum的目的是尽可能收集一个域的信息,它......
  • 枚举(enum)介绍
    引入包括Java和C++在内的几种编程语言在其语法中具有本机枚举或枚举数据类型。此数据类型允许您创建命名常量集,这些常量被视为包含枚举的成员。可以通过枚举本身访问成员。当您需要定义一组不可变且离散的相似或相关常量值时,枚举会派上用场,这些常量值在代码中可能具有也可能......
  • 『0017』 - Solidity Types - Solidity 枚举(Enums)
    作者:黎跃春,案例下面的代码是我对官方案例作了简单的修改而成。ActionChoices就是一个自定义的整型,当枚举数不够多时,它默认的类型为uint8,当枚举数足够多时,它会自动变成uint16,下面的GoLeft==0,GoRight==1,GoStraight==2,SitStill==3。在setGoStraight方法中,我们传入的参数......
  • ToggleButton (状态开关按钮)
    布局:<ToggleButtonandroid:id="@+id/toggleBt"android:layout_width="140.0dip"android:layout_height="wrap_content"/>usecode:@OverridepublicvoidonClick(Viewv){switch(v.getId()){caseR.id.btnCh......
  • IEnumerable 和 IEnumerator
    什么是IEnumerable?这是一个由可枚举类实现的接口。整个集合在c#可以实现IEnumerable接口。它返回IEnumerator。它不会根据代码中使用的访问说明符而更改。IEnumerable有一个称为GetEnumerator的方法。此实现仅在类内部完成。迭代过程使得在集合中遍历变得更容易。......
  • 类型类Type classes(第一部分)类约束 Eq、Ord、Show、Read、Enum、Num、Integral、Float
    类型类Typeclasses是一种定义某种行为的接口。如果类型是类型类的成员,则意味着类型支持并实现了类型类定义的行为。类约束==函数的类型,如下:type(==)(==)::Eqa=>a->a->Bool=>符号定义了一个类约束,==函数接受两个相同类型的形参,并返回Bool类型。这两个形参的类型......