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

    }
}

}

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js获取当前日期时间「建议收藏」

    js获取当前日期时间「建议收藏」functionThistime(){//当前日期vardate=newDate();varyear=date.getFullYear();varmonth=date.getMonth()+1;varday=date.getDate();varmytime=date.toLocaleTimeString();//获取当前时间//myDate.toLocaleString()

    2025年7月11日
    5
  • 乘法逆元一

    乘法逆元一乘法逆元一导入 分数取模考虑一个式子 x equiv dfrac 1 2 mod 7 即求一个数 x 它与 dfrac 1 2 模 7 的结果相同 称为 x 与 dfrac 1 2 对模 7 同余 分数取模不同于整数取模 但我们仍可以利用模运算的性质解决此题 模运算时两边同乘相同的数 两边仍然同余 所以将两边同乘

    2025年8月14日
    4
  • java date格式化类型_java日期格式化 结果要date类型[通俗易懂]

    满意答案yuj48gr562013.12.28采纳率:40%等级:12已帮助:11567人SimpleDateFormatformat=newSimpleDateFormat(“yyyy-MM-ddHH:mm:ss”);Dated=newDate();Stringdd=format.format(d);Dateddd;try{ddd=format.parse(d…

    2022年4月15日
    48
  • linux .zip文件 解压缩命令的简单使用

    linux .zip文件 解压缩命令的简单使用windows系统下常见的压缩格式有.zip.rarlinux系统下常见的压缩格式有.zip.gz.bz2.tar.gz.tar.bz2下面我来简单的介绍一下linux系统下zip压缩命令的使用方法.zip压缩命令的使用方法.zip的使用方法非常的简单使用zip命令即可压缩文件格式为zip压缩文件名源文件如图mywork

    2022年5月2日
    49
  • Jenkins配置插件界面中文显示「建议收藏」

    只将干货的操作技巧,不浪费彼此的时间。如果文中那个地方写的有问题,欢迎留言告诉我,谢谢~配置了发现有一些还是没有完全转化为中文~~~~配置操作过程第一步:查看是否安装了 Localization: Chinese (Simplified)具体查看步骤:Manage Jenkins –> Manage Plugins –> installed(已安装)检查如果…

    2022年2月28日
    45
  • Navicat 15 for MySQL注册激活码破解方法

    Navicat 15 for MySQL注册激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    104

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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