unity中shader的Cutout问题「建议收藏」

unity中shader的Cutout问题「建议收藏」unity中自带的shader里有Cutout类型的shader,zhe’zho

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

unity中自带的shader里有Cutout类型的shader,今天发现这种类型很诡异,先

贴几种自带的:

// Unlit alpha-cutout shader.
// – no lighting
// – no lightmap support
// – no per-material color

Shader “Unlit/Transparent Cutout” {

Properties {

    _MainTex (“Base (RGB) Trans (A)”, 2D) = “white” {}
    _Cutoff (“Alpha cutoff”, Range(0,1)) = 0.5
}
SubShader {

    Tags {“Queue”=”AlphaTest” “IgnoreProjector”=”True” “RenderType”=”TransparentCutout”}
    LOD 100

    Lighting Off

    Pass {  
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include “UnityCG.cginc”

            struct appdata_t {

                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {

                float4 vertex : SV_POSITION;
                half2 texcoord : TEXCOORD0;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _Cutoff;

            v2f vert (appdata_t v)
            {

                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }
            
            fixed4 frag (v2f i) : COLOR
            {

                fixed4 col = tex2D(_MainTex, i.texcoord);
                clip(col.a – _Cutoff);
                return col;
            }
        ENDCG
    }
}

}

Shader “Transparent/Cutout/Diffuse” {

Properties {

    _Color (“Main Color”, Color) = (1,1,1,1)
    _MainTex (“Base (RGB) Trans (A)”, 2D) = “white” {}
    _Cutoff (“Alpha cutoff”, Range(0,1)) = 0.5
}

SubShader {

    Tags {“Queue”=”AlphaTest” “IgnoreProjector”=”True” “RenderType”=”TransparentCutout”}
    LOD 200
    
CGPROGRAM
#pragma surface surf Lambert alphatest:_Cutoff

sampler2D _MainTex;
fixed4 _Color;

struct Input {

    float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {

    fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    o.Albedo = c.rgb;
    o.Alpha = c.a;
}
ENDCG
}

Fallback “Transparent/Cutout/VertexLit”
}

Shader “Transparent/Diffuse” {

Properties {

    _Color (“Main Color”, Color) = (1,1,1,1)
    _MainTex (“Base (RGB) Trans (A)”, 2D) = “white” {}
}

SubShader {

    Tags {“Queue”=”Transparent” “IgnoreProjector”=”True” “RenderType”=”Transparent”}
    LOD 200

CGPROGRAM
#pragma surface surf Lambert alpha

sampler2D _MainTex;
fixed4 _Color;

struct Input {

    float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {

    fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    o.Albedo = c.rgb;
    o.Alpha = c.a;
}
ENDCG
}

Fallback “Transparent/VertexLit”
}

我现在做的某个项目,模型需要用transparent/diffuse的效果,但是有的建筑窗户是贴图,贴图中的边缘导入时alpha是0,

我综合上述代码写了个shader,能再电脑上的unity的Android平台上运行,但是在手机上会死机。。Android手机只能同时支持

lightmap,Alphatest,ZTest 中的两种。

Shader “Custom/TranDifExt” {

    Properties {

    _Color (“Main Color”, Color) = (1,1,1,1)
    _MainTex (“Base (RGB) Trans (A)”, 2D) = “white” {}
    _Cutoff (“Alpha cutoff”, Range(0,1)) = 0.5
}

SubShader {

    Tags {“Queue”=”AlphaTest” “IgnoreProjector”=”True” “RenderType”=”TransparentCutout”}
    LOD 200

CGPROGRAM
//#pragma surface surf Lambert alpha
#pragma surface surf Lambert
#include “UnityCG.cginc”
sampler2D _MainTex;
fixed4 _Color;
fixed _Cutoff;

struct Input {

    float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {

    fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
    o.Albedo = c.rgb;
    o.Alpha = c.a;
    clip(o.Alpha-_Cutoff);
}
ENDCG
}

Fallback “VertexLit”
}

然后又被同伙找了个shader:”Transparent/Cutout/VertexLit”,可以在手机Android上执行,同时有lightmap,Alphatest,ZTest 三种(不死机)

Shader “Transparent/Cutout/VertexLit” {

Properties {

    _Color (“Main Color”, Color) = (1,1,1,1)
    _SpecColor (“Spec Color”, Color) = (1,1,1,0)
    _Emission (“Emissive Color”, Color) = (0,0,0,0)
    _Shininess (“Shininess”, Range (0.1, 1)) = 0.7
    _MainTex (“Base (RGB) Trans (A)”, 2D) = “white” {}
    _Cutoff (“Alpha cutoff”, Range(0,1)) = 0.5
}

SubShader {

    Tags {“Queue”=”AlphaTest” “IgnoreProjector”=”True” “RenderType”=”TransparentCutout”}
    LOD 100
    
    // Non-lightmapped
    Pass {

        Tags { “LightMode” = “Vertex” }
        Alphatest Greater [_Cutoff]
        AlphaToMask True
        ColorMask RGB
        Material {

            Diffuse [_Color]
            Ambient [_Color]
            Shininess [_Shininess]
            Specular [_SpecColor]
            Emission [_Emission]    
        }
        Lighting On
        SeparateSpecular On
        SetTexture [_MainTex] {

            Combine texture * primary DOUBLE, texture * primary
        }
    }
    
    // Lightmapped, encoded as dLDR
    Pass {

        Tags { “LightMode” = “VertexLM” }
        Alphatest Greater [_Cutoff]
        AlphaToMask True
        ColorMask RGB
        
        BindChannels {

            Bind “Vertex”, vertex
            Bind “normal”, normal
            Bind “texcoord1”, texcoord0 // lightmap uses 2nd uv
            Bind “texcoord”, texcoord1 // main uses 1st uv
        }
        SetTexture [unity_Lightmap] {

            matrix [unity_LightmapMatrix]
            constantColor [_Color]
            combine texture * constant
        }
        SetTexture [_MainTex] {

            combine texture * previous DOUBLE, texture * primary
        }
    }
    
    // Lightmapped, encoded as RGBM
    Pass {

        Tags { “LightMode” = “VertexLMRGBM” }
        Alphatest Greater [_Cutoff]
        AlphaToMask True
        ColorMask RGB
        
        BindChannels {

            Bind “Vertex”, vertex
            Bind “normal”, normal
            Bind “texcoord1”, texcoord0 // lightmap uses 2nd uv
            Bind “texcoord1”, texcoord1 // unused
            Bind “texcoord”, texcoord2 // main uses 1st uv
        }
        
        SetTexture [unity_Lightmap] {

            matrix [unity_LightmapMatrix]
            combine texture * texture alpha DOUBLE
        }
        SetTexture [unity_Lightmap] {

            constantColor [_Color]
            combine previous * constant
        }
        SetTexture [_MainTex] {

            combine texture * previous QUAD, texture * primary
        }
    }
    
    // Pass to render object as a shadow caster
    Pass {

        Name “Caster”
        Tags { “LightMode” = “ShadowCaster” }
        Offset 1, 1
        
        Fog {Mode Off}
        ZWrite On ZTest LEqual Cull Off

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_shadowcaster
#include “UnityCG.cginc”

struct v2f {
    V2F_SHADOW_CASTER;
    float2  uv : TEXCOORD1;
};

uniform float4 _MainTex_ST;

v2f vert( appdata_base v )
{

    v2f o;
    TRANSFER_SHADOW_CASTER(o)
    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
    return o;
}

uniform sampler2D _MainTex;
uniform fixed _Cutoff;
uniform fixed4 _Color;

float4 frag( v2f i ) : COLOR
{

    fixed4 texcol = tex2D( _MainTex, i.uv );
    clip( texcol.a*_Color.a – _Cutoff );
    
    SHADOW_CASTER_FRAGMENT(i)
}
ENDCG

    }
    
    // Pass to render object as a shadow collector
    Pass {

        Name “ShadowCollector”
        Tags { “LightMode” = “ShadowCollector” }
        
        Fog {Mode Off}
        ZWrite On ZTest LEqual

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_shadowcollector

#define SHADOW_COLLECTOR_PASS
#include “UnityCG.cginc”

struct v2f {

    V2F_SHADOW_COLLECTOR;
    float2  uv : TEXCOORD5;
};

uniform float4 _MainTex_ST;

v2f vert (appdata_base v)
{

    v2f o;
    TRANSFER_SHADOW_COLLECTOR(o)
    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
    return o;
}

uniform sampler2D _MainTex;
uniform fixed _Cutoff;
uniform fixed4 _Color;

fixed4 frag (v2f i) : COLOR
{

    fixed4 texcol = tex2D( _MainTex, i.uv );
    clip( texcol.a*_Color.a – _Cutoff );
    
    SHADOW_COLLECTOR_FRAGMENT(i)
}
ENDCG

    }
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189933.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PreparedStatement 不定参数处理「建议收藏」

    PreparedStatement 不定参数处理「建议收藏」最近项目用到PreparedStatement,根据输入条件查询数据,输入条件不为空,则参与查询,为空,则不参与查询。网上搜了,也是按照网上的方法,也不算原创,记录一下。参考文章:https://blog.csdn.net/dream_broken/article/details/44681597/代码如下:Connectionconn=null;PreparedStatem…

  • 括号匹配算法「建议收藏」

    概述​括号匹配在很多字符串处理的场景中时常被用到,诸如各大IDE括号不匹配的错误提示,编译器编译时检查应该成对出现的括号是否符合要求等,在这里我们就直接使用一种比较常规,但效率不差的方法去解决括号匹配的问题就行了。栈方法匹配问题​为了方便描述,对于需要做匹配的两个符号,比如’(‘和’)’,前者可称为左侧符号,后者可称为右侧符号。在做符号匹配时,如果以左侧符号

  • 開發中的DEV,QAS,UAT,PRD是什麼意思

    開發中的DEV,QAS,UAT,PRD是什麼意思IDES:InternetDemonstrationandEvaluationSystem交互式演示与评估系统DEV:DevelopmentSystem,开发系统QAS:QualityAssuranceSystem,质量保证系统UAT:UserAcceptanceTest用户验收测试PRD:ProductionSystem,生产系统…

  • calendar java_java中Calendar类的使用讲解

    calendar java_java中Calendar类的使用讲解Calendar类是我们在工作中经常用到时间相关的一个工具类;比如月初、月末、年初、年末、指定月份所在季度的季末等操作,对它有更深入的了解,在工作中会起到事半功倍的效果,下面就来了解一下吧!!!**一.Calendar类概述Calendar是日历类,该类将所有可能用到的时间信息封装为静态成员变量,方便获取。常用方法如下如下://根据日历的规则,为给定的日历字段添加或减去指定的时间量。abstrac…

  • OSChina 周六乱弹 —— 人家过得是造儿童节,咱呢?[通俗易懂]

    2019独角兽企业重金招聘Python工程师标准>>>…

  • smalldatetime java,如何在数据导入期间将平面文件中的dd-mmm-yy值格式化为smalldatetime?…[通俗易懂]

    smalldatetime java,如何在数据导入期间将平面文件中的dd-mmm-yy值格式化为smalldatetime?…[通俗易懂]IhaveaflatfilewhichisimportedintoSQLServerviaanexistingSSISpackage.Ineedtomakeachangetothepackagetoaccommodateanewfieldintheflatfile.Thenewfieldisadatefieldwhi…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号