Search Unity

  1. Good news ✨ We have more Unite Now videos available for you to watch on-demand! Come check them out and ask our experts any questions!
    Dismiss Notice

Backface culling in Unity

Discussion in 'Editor & General Support' started by Marowe, May 13, 2010.

  1. Marowe

    Marowe

    Joined:
    May 13, 2010
    Posts:
    5
    I've been trying to figure out how to get backface culling to turn off in Unity, since I don't want to waste the polys by making everything have two sides.

    I've read in a few places that I need to type something like CullOff in the Pass of the shader...I'm not sure where to type this in to turn it off, and I'm not much of a coder so I don't know where to look.

    Any help would be greatly appreciated! Thanks!
     
    jabo12 likes this.
  2. Eric5h5

    Eric5h5

    Volunteer Moderator Moderator

    Joined:
    Jul 19, 2006
    Posts:
    32,249
    By default, backface culling is on, which means everything has one side (the back face is culled). You don't want to use Cull Off, except for those cases where you do want to render both sides.

    --Eric
     
  3. Marowe

    Marowe

    Joined:
    May 13, 2010
    Posts:
    5
    Yeah, that's exactly what I want. :(
     
    BrainSlugs83 and chunyiugary like this.
  4. Eric5h5

    Eric5h5

    Volunteer Moderator Moderator

    Joined:
    Jul 19, 2006
    Posts:
    32,249
    Oh, I misunderstood your question. You can look in the shader source for the particle shaders, for example, because they all have backface culling turned off. Basically it's just putting "Cull Off" in the "SubShader" section.

    --Eric
     
    Demanuele likes this.
  5. Marowe

    Marowe

    Joined:
    May 13, 2010
    Posts:
    5
    Thanks for the help, Eric. Unfortunately I'm still not sure exactly what to do though, mostly because I don't know how to access the "SubShader" section, and I only started using Unity yesterday so I'm not sure where to look. I opened the material up in a script editor and didn't see any culling flags (though I know almost nothing about scripting so I may have overlooked something) and I'm not sure if this is a glitch, but if I select "Edit Shader..." in Unity, nothing pops up :(

    I spent a while looking, because I don't want to be like one of those lazy noobs that expects answers to fall in their lap, but I'm really at a loss of what to do...I understand what you suggested, I'm just not sure where to find any of that stuff. Sorry >__<
     
  6. Daniel_Brauer

    Daniel_Brauer

    Unity Technologies

    Joined:
    Aug 11, 2006
    Posts:
    3,356
    If you want your objects to be properly lit, I highly recommend avoiding the Cull Off approach. Basically, Cull Off will get you two-sided geometry with one side lit incorrectly. The work-around is to make complex modifications to existing shaders and take a performance hit due to the extra draw calls.

    Unless you are seriously limited by mesh data size, the easiest and best-performing way to render backfaces is to double your mesh and flip the normals on the duplicate.
     
    mandisaw and artician like this.
  7. Eric5h5

    Eric5h5

    Volunteer Moderator Moderator

    Joined:
    Jul 19, 2006
    Posts:
    32,249
    You can only edit your own custom shaders. However, you can download the source for all the built-in shaders (look at the sticky in the Shaderlab forum). I agree that, generally speaking, duplicating geometry is the best way. It's still good to know how to do the cull off thing for special cases though.

    --Eric
     
  8. Marowe

    Marowe

    Joined:
    May 13, 2010
    Posts:
    5
    Ah, I didn't realize there was such a drawback to turning off the culling. I guess I'll try it and see how it looks, but it probably won't be pretty by the sound of it. Thank you for the help guys, I REALLY appreciate it!
     
  9. Daniel_Brauer

    Daniel_Brauer

    Unity Technologies

    Joined:
    Aug 11, 2006
    Posts:
    3,356
    Reading my post, I don't think I made it clear that turning culling off is appropriate and faster when you don't want to do any lighting. As such, it can be useful for special effects or non-photorealistic rendering.
     
  10. OutCyder

    OutCyder

    Joined:
    Mar 19, 2009
    Posts:
    2,178
    I totally agree with this post: if you need to have a biface mesh the best way is to duplicate it and flip normals.
    This is the right way for so many reasons...

    Otherwise you have to code your shader but will not perform so fast.

    The only drawback, as they told you, is that you will use twice the memory for the mesh... but usually this is not a problem.
     
  11. Marowe

    Marowe

    Joined:
    May 13, 2010
    Posts:
    5
    Thanks for all the tips guys. It's definitely a lot more apparent that Cull Off won't solve the problem.

    I really appreciate all the help! Thank you :D
     
  12. Legion555

    Legion555

    Joined:
    Mar 22, 2014
    Posts:
    2
    4 years later,
    At this moment with unity 4.X back facing culling off works very good for clothes and hair shaders. just depends on your needs, but if you create a shader and then set the culling off in the subshader section everything works very fine, (at least for me)
     
  13. Noah492

    Noah492

    Joined:
    Jul 2, 2014
    Posts:
    44
    Hi Daniel, how exactly do I do the alternative. Ctrl+D to duplicate right? And then how do I flip the normals on the duplicate?
     
    nadeeramy likes this.
  14. otomo

    otomo

    Joined:
    Feb 11, 2015
    Posts:
    4
    You would have to do it in your 3D Editor of choice. As far as I know you cannot edit Meshes in Unity, at least not through the editor.
     
  15. nadeeramy

    nadeeramy

    Joined:
    Aug 13, 2015
    Posts:
    2
    so how exactly?
     
  16. nadeeramy

    nadeeramy

    Joined:
    Aug 13, 2015
    Posts:
    2
    hi all I just installed n tried using Unity yesterday...
     
  17. guywald

    guywald

    Joined:
    Aug 22, 2013
    Posts:
    12
    Thanks! You saved me a lot of time. I had the same problem of a "side not appearing".
    Flipping the normals solved this.

    A method showing how to do this can be found at:
    http://wiki.unity3d.com/index.php/ReverseNormals

    Thanks.
     
  18. Anki13

    Anki13

    Joined:
    Oct 26, 2017
    Posts:
    1
    I read all the comments and answer for this particular question and i agree to most of it. What if someone is doing vertex paint and want its plane to be double sided then how can we do that?? How can we make a plane double side to do vertex painting in Unity???!!!
     
  19. MadeFromPolygons

    MadeFromPolygons

    Joined:
    Oct 5, 2013
    Posts:
    2,547
    I am so sick of saying this, but please DO NOT bring back to life threads that are 2 years old.
     
  20. Honorsoft

    Honorsoft

    Joined:
    Oct 31, 2016
    Posts:
    66
    I found this thread trying to find out how to turn off culling in a shader in Unity 2018.x. I'm getting 'shader compile errors' when I try the 'Unity 5' method. Anyways, someone online recommended duplicating all the faces and fliping them over as a solution, but doubling the model size isn't wise. I will keep looking for a 2018 (or now 2019) shader that has back-face culling turned off, but if anyone needed the culling turned off for Unity 5 then I'll post the basic Standard Shader (Unity 5 version) with culling turned off. You can make the same change to any shader, just put the Cull Off in the sub-shader section. (Note: Standard Shaders might vary from version to version, this shader seems to work with Unity 5, but not with Unity 2018.

    (Save as "StandardCullOFF.shader"):

    Code (CSharp):
    1. Shader "StandardCullOFF"
    2. {
    3.     Properties
    4.     {
    5.         _Color("Color", Color) = (1,1,1,1)
    6.         _MainTex("Albedo", 2D) = "white" {}
    7.    
    8.         _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
    9.  
    10.         _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
    11.         _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
    12.         [Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0
    13.  
    14.         [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
    15.         _MetallicGlossMap("Metallic", 2D) = "white" {}
    16.  
    17.         [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
    18.         [ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0
    19.  
    20.         _BumpScale("Scale", Float) = 1.0
    21.         _BumpMap("Normal Map", 2D) = "bump" {}
    22.  
    23.         _Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
    24.         _ParallaxMap ("Height Map", 2D) = "black" {}
    25.  
    26.         _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
    27.         _OcclusionMap("Occlusion", 2D) = "white" {}
    28.  
    29.         _EmissionColor("Color", Color) = (0,0,0)
    30.         _EmissionMap("Emission", 2D) = "white" {}
    31.    
    32.         _DetailMask("Detail Mask", 2D) = "white" {}
    33.  
    34.         _DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
    35.         _DetailNormalMapScale("Scale", Float) = 1.0
    36.         _DetailNormalMap("Normal Map", 2D) = "bump" {}
    37.  
    38.         [Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0
    39.  
    40.  
    41.         // Blending state
    42.          _Mode ("__mode", Float) = 0.0
    43.          _SrcBlend ("__src", Float) = 1.0
    44.          _DstBlend ("__dst", Float) = 0.0
    45.          _ZWrite ("__zw", Float) = 1.0
    46.     }
    47.  
    48.     CGINCLUDE
    49.         #define UNITY_SETUP_BRDF_INPUT MetallicSetup
    50.     ENDCG
    51.  
    52.     SubShader
    53.     {
    54.         Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
    55.         LOD 300
    56.  
    57.         // ------------------------------------------------------------------
    58.         //  Base forward pass (directional light, emission, lightmaps, ...)
    59.         Pass
    60.         {
    61.        
    62.             Name "FORWARD"
    63.             Tags { "LightMode" = "ForwardBase" }
    64.  
    65.             Blend [_SrcBlend] [_DstBlend]
    66.             ZWrite [_ZWrite]
    67.             Cull Off //  HERE IS WHERE YOU PUT CULL OFF
    68.  
    69.             CGPROGRAM
    70.             #pragma target 3.0
    71.  
    72.             // -------------------------------------
    73.  
    74.             #pragma shader_feature _NORMALMAP
    75.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    76.             #pragma shader_feature _EMISSION
    77.             #pragma shader_feature _METALLICGLOSSMAP
    78.             #pragma shader_feature ___ _DETAIL_MULX2
    79.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    80.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    81.             #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
    82.             #pragma shader_feature _PARALLAXMAP
    83.  
    84.             #pragma multi_compile_fwdbase
    85.             #pragma multi_compile_fog
    86.  
    87.             #pragma vertex vertBase
    88.             #pragma fragment fragBase
    89.             #include "UnityStandardCoreForward.cginc"
    90.  
    91.             ENDCG
    92.         }
    93.         // ------------------------------------------------------------------
    94.         //  Additive forward pass (one light per pass)
    95.         Pass
    96.         {
    97.             Name "FORWARD_DELTA"
    98.             Tags { "LightMode" = "ForwardAdd" }
    99.             Blend [_SrcBlend] One
    100.             Fog { Color (0,0,0,0) } // in additive pass fog should be black
    101.             ZWrite Off
    102.             ZTest LEqual
    103.  
    104.             CGPROGRAM
    105.             #pragma target 3.0
    106.  
    107.             // -------------------------------------
    108.  
    109.  
    110.             #pragma shader_feature _NORMALMAP
    111.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    112.             #pragma shader_feature _METALLICGLOSSMAP
    113.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    114.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    115.             #pragma shader_feature ___ _DETAIL_MULX2
    116.             #pragma shader_feature _PARALLAXMAP
    117.  
    118.             #pragma multi_compile_fwdadd_fullshadows
    119.             #pragma multi_compile_fog
    120.  
    121.  
    122.             #pragma vertex vertAdd
    123.             #pragma fragment fragAdd
    124.             #include "UnityStandardCoreForward.cginc"
    125.  
    126.             ENDCG
    127.         }
    128.         // ------------------------------------------------------------------
    129.         //  Shadow rendering pass
    130.         Pass {
    131.             Name "ShadowCaster"
    132.             Tags { "LightMode" = "ShadowCaster" }
    133.  
    134.             ZWrite On ZTest LEqual
    135.  
    136.             CGPROGRAM
    137.             #pragma target 3.0
    138.  
    139.             // -------------------------------------
    140.  
    141.  
    142.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    143.             #pragma shader_feature _METALLICGLOSSMAP
    144.             #pragma shader_feature _PARALLAXMAP
    145.             #pragma multi_compile_shadowcaster
    146.  
    147.             #pragma vertex vertShadowCaster
    148.             #pragma fragment fragShadowCaster
    149.  
    150.             #include "UnityStandardShadow.cginc"
    151.  
    152.             ENDCG
    153.         }
    154.         // ------------------------------------------------------------------
    155.         //  Deferred pass
    156.         Pass
    157.         {
    158.             Name "DEFERRED"
    159.             Tags { "LightMode" = "Deferred" }
    160.  
    161.             CGPROGRAM
    162.             #pragma target 3.0
    163.             #pragma exclude_renderers nomrt
    164.  
    165.  
    166.             // -------------------------------------
    167.  
    168.             #pragma shader_feature _NORMALMAP
    169.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    170.             #pragma shader_feature _EMISSION
    171.             #pragma shader_feature _METALLICGLOSSMAP
    172.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    173.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    174.             #pragma shader_feature ___ _DETAIL_MULX2
    175.             #pragma shader_feature _PARALLAXMAP
    176.  
    177.             #pragma multi_compile ___ UNITY_HDR_ON
    178.             #pragma multi_compile ___ LIGHTMAP_ON
    179.             #pragma multi_compile ___ DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
    180.             #pragma multi_compile ___ DYNAMICLIGHTMAP_ON
    181.  
    182.             #pragma vertex vertDeferred
    183.             #pragma fragment fragDeferred
    184.  
    185.             #include "UnityStandardCore.cginc"
    186.  
    187.             ENDCG
    188.         }
    189.  
    190.         // ------------------------------------------------------------------
    191.         // Extracts information for lightmapping, GI (emission, albedo, ...)
    192.         // This pass it not used during regular rendering.
    193.         Pass
    194.         {
    195.             Name "META"
    196.             Tags { "LightMode"="Meta" }
    197.  
    198.             Cull Off
    199.  
    200.             CGPROGRAM
    201.             #pragma vertex vert_meta
    202.             #pragma fragment frag_meta
    203.  
    204.             #pragma shader_feature _EMISSION
    205.             #pragma shader_feature _METALLICGLOSSMAP
    206.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    207.             #pragma shader_feature ___ _DETAIL_MULX2
    208.  
    209.             #include "UnityStandardMeta.cginc"
    210.             ENDCG
    211.         }
    212.     }
    213.  
    214.     SubShader
    215.     {
    216.         Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
    217.         LOD 150
    218.  
    219.         // ------------------------------------------------------------------
    220.         //  Base forward pass (directional light, emission, lightmaps, ...)
    221.         Pass
    222.         {
    223.             Name "FORWARD"
    224.             Tags { "LightMode" = "ForwardBase" }
    225.  
    226.             Blend [_SrcBlend] [_DstBlend]
    227.             ZWrite [_ZWrite]
    228.  
    229.             CGPROGRAM
    230.             #pragma target 2.0
    231.        
    232.             #pragma shader_feature _NORMALMAP
    233.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    234.             #pragma shader_feature _EMISSION
    235.             #pragma shader_feature _METALLICGLOSSMAP
    236.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    237.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    238.             #pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
    239.             // SM2.0: NOT SUPPORTED shader_feature ___ _DETAIL_MULX2
    240.             // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
    241.  
    242.             #pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED DIRLIGHTMAP_SEPARATE
    243.  
    244.             #pragma multi_compile_fwdbase
    245.             #pragma multi_compile_fog
    246.  
    247.             #pragma vertex vertBase
    248.             #pragma fragment fragBase
    249.             #include "UnityStandardCoreForward.cginc"
    250.  
    251.             ENDCG
    252.         }
    253.         // ------------------------------------------------------------------
    254.         //  Additive forward pass (one light per pass)
    255.         Pass
    256.         {
    257.             Name "FORWARD_DELTA"
    258.             Tags { "LightMode" = "ForwardAdd" }
    259.             Blend [_SrcBlend] One
    260.             Fog { Color (0,0,0,0) } // in additive pass fog should be black
    261.             ZWrite Off
    262.             ZTest LEqual
    263.        
    264.             CGPROGRAM
    265.             #pragma target 2.0
    266.  
    267.             #pragma shader_feature _NORMALMAP
    268.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    269.             #pragma shader_feature _METALLICGLOSSMAP
    270.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    271.             #pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
    272.             #pragma shader_feature ___ _DETAIL_MULX2
    273.             // SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
    274.             #pragma skip_variants SHADOWS_SOFT
    275.        
    276.             #pragma multi_compile_fwdadd_fullshadows
    277.             #pragma multi_compile_fog
    278.        
    279.             #pragma vertex vertAdd
    280.             #pragma fragment fragAdd
    281.             #include "UnityStandardCoreForward.cginc"
    282.  
    283.             ENDCG
    284.         }
    285.         // ------------------------------------------------------------------
    286.         //  Shadow rendering pass
    287.         Pass {
    288.             Name "ShadowCaster"
    289.             Tags { "LightMode" = "ShadowCaster" }
    290.        
    291.             ZWrite On ZTest LEqual
    292.  
    293.             CGPROGRAM
    294.             #pragma target 2.0
    295.  
    296.             #pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
    297.             #pragma shader_feature _METALLICGLOSSMAP
    298.             #pragma skip_variants SHADOWS_SOFT
    299.             #pragma multi_compile_shadowcaster
    300.  
    301.             #pragma vertex vertShadowCaster
    302.             #pragma fragment fragShadowCaster
    303.  
    304.             #include "UnityStandardShadow.cginc"
    305.  
    306.             ENDCG
    307.         }
    308.  
    309.         // ------------------------------------------------------------------
    310.         // Extracts information for lightmapping, GI (emission, albedo, ...)
    311.         // This pass it not used during regular rendering.
    312.         Pass
    313.         {
    314.             Name "META"
    315.             Tags { "LightMode"="Meta" }
    316.  
    317.             Cull Off
    318.  
    319.             CGPROGRAM
    320.             #pragma vertex vert_meta
    321.             #pragma fragment frag_meta
    322.  
    323.             #pragma shader_feature _EMISSION
    324.             #pragma shader_feature _METALLICGLOSSMAP
    325.             #pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    326.             #pragma shader_feature ___ _DETAIL_MULX2
    327.  
    328.             #include "UnityStandardMeta.cginc"
    329.             ENDCG
    330.         }
    331.     }
    332.  
    333.  
    334.     FallBack "VertexLit"
    335.     CustomEditor "StandardShaderGUI"
    336. }
    337.  
     
    Last edited: Dec 13, 2019
    Edwin_deVries likes this.
  21. dbchest

    dbchest

    Joined:
    Sep 26, 2016
    Posts:
    21
    Thanks for this, Eric! I found this post via search tonight and it was exactly what I needed,
    Derek
     
  22. mranger

    mranger

    Joined:
    Jan 26, 2019
    Posts:
    12
    I read through this twice and still don't know how to access the sub shader section.
     
    F4bs likes this.
  23. wenyu-zhang

    wenyu-zhang

    Joined:
    Aug 9, 2019
    Posts:
    1
    You have to create a new 'Standard Surface Shader' in Unity, then double click on it to open it in Visual Studio.
     
  24. Honorsoft

    Honorsoft

    Joined:
    Oct 31, 2016
    Posts:
    66
    It's 2020 now, I have Unity 2019 but am using 2018. I had the same problem trying to turn off backface culling. I edited an Unity 2018 shader too include CULL OFF but it didn't seem to work. It did work with 2015 shaders though.

    Anyways, I found a couple of shaders that have culling off and work in Unity 2018:
    https://gist.github.com/unitycoder/469118783af9d2fd0e2b36becc7dd347

    Namely, this one:
    https://gist.github.com/unitycoder/...dea2b044497bde3b4cf492/Standard-2Sided.shader

    I find that CULL OFF is necessary for things like hair and capes or clothing.

    (Just a thought, you could use that GitHub direct link to the shader during runtime in Unity by loading it with a UnityWebRequest...Basically a "cloud shader" located on GitHub.)
     
    Zhelatin and salex1 like this.
  25. Honorsoft

    Honorsoft

    Joined:
    Oct 31, 2016
    Posts:
    66
    See? There's still people talking about it in 2019 and 2020. Maybe contribute to the conversation.

    Many threads need updating still because they still exist online and appear in web searches but are outdated. Contribute also, or stay quiet and let others converse.
     
    Last edited: Aug 21, 2020
unityunity