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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 矢量编程——随着MNIST案例

    矢量编程——随着MNIST案例

    2022年1月13日
    38
  • matplotlib无法显示图片_pycharm不出图

    matplotlib无法显示图片_pycharm不出图在学习Matplotlib的时候,在Pycharm中运行的时候不会弹出画的图像。首先你运行之后最小化pycharm,看看是不是已经出来了,只是没有自己弹到最顶层。 代码如下: importnumpyasnpimportmatplotlib.pyplotaspltdefmain():#线的绘制x=np.linspace(-np.p…

    2022年8月25日
    6
  • httprunner(2)下载安装[通俗易懂]

    httprunner(2)下载安装[通俗易懂]环境要求HttpRunner是一个基于Python开发的测试框架,可以运行在macOS、Linux、Windows系统平台上。这里使用macOS系统进行演示对于python版本要求:py

    2022年8月6日
    2
  • 机器学习框架简述

    机器学习框架简述机器学习框架意味着一个能够整合包括机器学习算法在内的所有机器学习的系统或方法,使用户最有效的使用它们。具体来讲,这包括数据表示与处理的方法、表示和建立预测模型的方法、评价和使用建模结果的方法。在所有可用的机器学习框架中,着重于迭代算法和交互处理的框架被公认为是最好的,因为这些特性可以促进复杂预测模型估计和研究人员与数据间的良好交互。当下,优秀的机器学习框架依旧需要包含大数据功能…

    2022年6月17日
    29
  • Vue生命周期钩子(三)「建议收藏」

    Vue生命周期钩子(三)「建议收藏」Vue生命周期图Vue中共有11个生命周期函数,本文只说明8个生命周期钩子beforeCreate:实例刚在内存中被创建出来,此时,还没有初始化好data和methods属性created:实例已经在内存中创建完毕,此时 data 和 methods 已经创建完毕,此时还没有开始编译模板beforeMount:此时已经完成了模板的编译,但是还没有挂载到页面中…

    2022年6月13日
    27
  • pycharm 2021永久激活码【最新永久激活】

    (pycharm 2021永久激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html2QQ4OQYW6M-eyJsa…

    2022年3月22日
    179

发表回复

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

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