Unity的双面材质 Two-Side

基本原理就是:正面打光,背面不打光
代码使用的还是官方的底层API,其实没什么亮点;是Unity 的API做的很好么,不是的,是GarFey小哥比较厉害,能在一堆粪山中找出粪坑那个点,厉害厉害,所以就稍微转载一下。。。。留个纪念,本人后来也没继续在Unity做双面Shader的需求
再补充说明一下,本来以为2022年Unity Shader会有一个大革新,因为全球感冒大流行,推到2024年,总行了吧(不会的,根本不会改);所以,下面这段代码应该会长期能用,因为Unity自己一大堆历史包袱,对于我们开发者的好处就是比较稳定,这段代码能用很长一段时间,而不会冲突
双面材质 

Unity双面材质--Shader


 

是不是在Unity开发中会遇到双面材质问题,双面材质就是在3dmax或者maya中用了片或者单面,可以从一面可以透过。

shader中 Rendering Mode中提供了几种渲染模式。
可以对Metallic、Smoothness进行调整,选择Source模式。

Unity双面材质--Shader


 
上代码:
Shader "GarFey/Standard(Two Side)"
{
    Properties
    {
       _Color("Color", Color) = (1,1,1,1)
       _MainTex("Albedo", 2D) = "white" {}

       _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

       _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
       _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
       [Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0

       [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
       _MetallicGlossMap("Metallic", 2D) = "white" {}

       [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
       [ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0

       _BumpScale("Scale", Float) = 1.0
       _BumpMap("Normal Map", 2D) = "bump" {}

       _Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
       _ParallaxMap ("Height Map", 2D) = "black" {}

       _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
       _OcclusionMap("Occlusion", 2D) = "white" {}

       _EmissionColor("Color", Color) = (0,0,0)
       _EmissionMap("Emission", 2D) = "white" {}

       _DetailMask("Detail Mask", 2D) = "white" {}

       _DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
       _DetailNormalMapScale("Scale", Float) = 1.0
       _DetailNormalMap("Normal Map", 2D) = "bump" {}

       [Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0


       // Blending state
       [HideInInspector] _Mode ("__mode", Float) = 0.0
       [HideInInspector] _SrcBlend ("__src", Float) = 1.0
       [HideInInspector] _DstBlend ("__dst", Float) = 0.0
       [HideInInspector] _ZWrite ("__zw", Float) = 1.0
    }

    CGINCLUDE
       #define UNITY_SETUP_BRDF_INPUT MetallicSetup
    ENDCG

    SubShader
    {
       Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
       LOD 300


       // ------------------------------------------------------------------
       //  Base forward pass (directional light, emission, lightmaps, ...)
       Pass
       {
           Name "FORWARD" 
           Tags { "LightMode" = "ForwardBase" }
           Cull Off
           Blend [_SrcBlend] [_DstBlend]
           ZWrite [_ZWrite]

          CGPROGRAM
           #pragma target 3.0

           // -------------------------------------

           #pragma shader_feature _NORMALMAP
           #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
           #pragma shader_feature _EMISSION
           #pragma shader_feature _METALLICGLOSSMAP
           #pragma shader_feature ___ _DETAIL_MULX2
           #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
           #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
           #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
           #pragma shader_feature _PARALLAXMAP

           #pragma multi_compile_fwdbase
           #pragma multi_compile_fog
           #pragma multi_compile_instancing

           #pragma vertex vertBase
           #pragma fragment fragBase
           #include "UnityStandardCoreForward.cginc"

          ENDCG
       }
       // ------------------------------------------------------------------
       //  Additive forward pass (one light per pass)
       Pass
       {
           Name "FORWARD_DELTA"
           Tags { "LightMode" = "ForwardAdd" }
           Blend [_SrcBlend] One
           Fog { Color (0,0,0,0) } // in additive pass fog should be black
           ZWrite Off
           ZTest LEqual

          CGPROGRAM
           #pragma target 3.0

           // -------------------------------------


           #pragma shader_feature _NORMALMAP
           #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
           #pragma shader_feature _METALLICGLOSSMAP
           #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
           #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
           #pragma shader_feature ___ _DETAIL_MULX2
           #pragma shader_feature _PARALLAXMAP

           #pragma multi_compile_fwdadd_fullshadows
           #pragma multi_compile_fog

           #pragma vertex vertAdd
           #pragma fragment fragAdd
           #include "UnityStandardCoreForward.cginc"

          ENDCG
       }
       // ------------------------------------------------------------------
       //  Shadow rendering pass
       Pass {
           Name "ShadowCaster"
           Tags { "LightMode" = "ShadowCaster" }

           ZWrite On ZTest LEqual

          CGPROGRAM
           #pragma target 3.0

           // -------------------------------------


           #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
           #pragma shader_feature _METALLICGLOSSMAP
           #pragma shader_feature _PARALLAXMAP
           #pragma multi_compile_shadowcaster
           #pragma multi_compile_instancing

           #pragma vertex vertShadowCaster
           #pragma fragment fragShadowCaster

           #include "UnityStandardShadow.cginc"

          ENDCG
       }
       // ------------------------------------------------------------------
       //  Deferred pass
       Pass
       {
           Name "DEFERRED"
           Tags { "LightMode" = "Deferred" }
           Cull Off
          CGPROGRAM
           #pragma target 3.0
           #pragma exclude_renderers nomrt


           // -------------------------------------

           #pragma shader_feature _NORMALMAP
           #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
           #pragma shader_feature _EMISSION
           #pragma shader_feature _METALLICGLOSSMAP
           #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
           #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
           #pragma shader_feature ___ _DETAIL_MULX2
           #pragma shader_feature _PARALLAXMAP

           #pragma multi_compile_prepassfinal
           #pragma multi_compile_instancing

           #pragma vertex vertDeferred
           #pragma fragment fragDeferred

           #include "UnityStandardCore.cginc"

          ENDCG
       }

       // ------------------------------------------------------------------
       // Extracts information for lightmapping, GI (emission, albedo, ...)
       // This pass it not used during regular rendering.
       Pass
       {
           Name "META" 
           Tags { "LightMode"="Meta" }

           Cull Off

          CGPROGRAM
           #pragma vertex vert_meta
           #pragma fragment frag_meta

           #pragma shader_feature _EMISSION
           #pragma shader_feature _METALLICGLOSSMAP
           #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
           #pragma shader_feature ___ _DETAIL_MULX2
           #pragma shader_feature EDITOR_VISUALIZATION

           #include "UnityStandardMeta.cginc"
          ENDCG
       }
    }

    SubShader
    {
       Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
       LOD 150

       // ------------------------------------------------------------------
       //  Base forward pass (directional light, emission, lightmaps, ...)
       Pass
       {
           Name "FORWARD" 
           Tags { "LightMode" = "ForwardBase" }

           Blend [_SrcBlend] [_DstBlend]
           ZWrite [_ZWrite]

          CGPROGRAM
           #pragma target 2.0

           #pragma shader_feature _NORMALMAP
           #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
           #pragma shader_feature _EMISSION 
           #pragma shader_feature _METALLICGLOSSMAP 
           #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
           #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
           #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
           // SM2.0: NOT SUPPORTED shader_feature ___ _DETAIL_MULX2
           // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP

           #pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED

           #pragma multi_compile_fwdbase
           #pragma multi_compile_fog

           #pragma vertex vertBase
           #pragma fragment fragBase
           #include "UnityStandardCoreForward.cginc"

          ENDCG
       }
       // ------------------------------------------------------------------
       //  Additive forward pass (one light per pass)
       Pass
       {
           Name "FORWARD_DELTA"
           Tags { "LightMode" = "ForwardAdd" }
           Blend [_SrcBlend] One
           Fog { Color (0,0,0,0) } // in additive pass fog should be black
           ZWrite Off
           ZTest LEqual

          CGPROGRAM
           #pragma target 2.0

           #pragma shader_feature _NORMALMAP
           #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
           #pragma shader_feature _METALLICGLOSSMAP
           #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
           #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
           #pragma shader_feature ___ _DETAIL_MULX2
           // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
           #pragma skip_variants SHADOWS_SOFT

           #pragma multi_compile_fwdadd_fullshadows
           #pragma multi_compile_fog

           #pragma vertex vertAdd
           #pragma fragment fragAdd
           #include "UnityStandardCoreForward.cginc"

          ENDCG
       }
       // ------------------------------------------------------------------
       //  Shadow rendering pass
       Pass {
           Name "ShadowCaster"
           Tags { "LightMode" = "ShadowCaster" }

           ZWrite On ZTest LEqual

          CGPROGRAM
           #pragma target 2.0

           #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
           #pragma shader_feature _METALLICGLOSSMAP
           #pragma skip_variants SHADOWS_SOFT
           #pragma multi_compile_shadowcaster

           #pragma vertex vertShadowCaster
           #pragma fragment fragShadowCaster

           #include "UnityStandardShadow.cginc"

          ENDCG
       }

       // ------------------------------------------------------------------
       // Extracts information for lightmapping, GI (emission, albedo, ...)
       // This pass it not used during regular rendering.
       Pass
       {
           Name "META" 
           Tags { "LightMode"="Meta" }

           Cull Off

          CGPROGRAM
           #pragma vertex vert_meta
           #pragma fragment frag_meta

           #pragma shader_feature _EMISSION
           #pragma shader_feature _METALLICGLOSSMAP
           #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
           #pragma shader_feature ___ _DETAIL_MULX2
           #pragma shader_feature EDITOR_VISUALIZATION

           #include "UnityStandardMeta.cginc"
          ENDCG
       }
    }


    FallBack "VertexLit"
    CustomEditor "StandardShaderGUI"
}

用的好记得关注博主,会有更新Unity相关知识(Unity基础、VR、AR、C#使用等)。
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值