Double Sided Standard Specular Shader

Hey Guys,

I have grabbed the Unity shaders of the website and am trying to edit the Standard Specular shader to be double sided with correct lighting calculations for the back side. Has anybody had any luck or done a similar thing ?

I am aware that setting Cull Off enables back face shading but it doesn’t have the correct lighting calculations.

In theory i think I just have to apply the reverse normals (on the back face) and apply the lighting to the back faces but unsure how/where to do it as the Standard specular shader is so big with multiple passes.

Anyways any help would be great!

There’s an asset on the store that does this, to implement properly requires creating very minorly modified versions of several of the standard shader files. Alternatively you can make a standard surface shader that does this much more easily, though it won’t have all of the features of the default standard shader. I’ve posted some examples elsewhere on the forum, search for VFACE.

Okay so I have come up with this and it seems to work correctly. Just wondering if this is a bad way to do it?

Shader "Custom/DoubleSided" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
        _BumpMap("NormalMap", 2D) = "Bump" {}
        _BumpScale("Normal Power", Float) = 1.0
        _NormalDefault("Normal Default", Color) = (128, 128, 255)
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

            // Render back faces first
            Cull Front
            CGPROGRAM
            // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

            // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

            sampler2D _MainTex;
        sampler2D _BumpMap;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _BumpScale;
        half _Metallic;
        fixed4 _Color;
        half3 _NormalDefault;

        void surf(Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Normal = -UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
            //o.Normal = -_NormalDefault;
            o.Alpha = c.a;
        }
        ENDCG
       

            // Now render front faces
            Cull Back
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _BumpMap;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _BumpScale;
        half _Metallic;
        fixed4 _Color;
        half3 _NormalDefault;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
            //o.Normal = _NormalDefault;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
2 Likes

The two pass method works, but it’s slower than just using a single pass and VFACE. I posted some examples here:

It also has an example of how to do what you’re looking for in your other post about alpha cutout & fade with surface shaders.

1 Like

Oh thanks I think the shader you gave (Standard Two Sided Soft Blend) from that was exactly what I am after, it’s also for a hair shader.

VFACE for the win!

Thanks again!

Could you please publish Standard Specular Double Sided shader which you create?