Surface Shader with full Standard Shader Properties

I need a surface shader that makes minimum changes to the Standard PB shader, but that keeps all of its features. Let’s say I just want to change the render queue but otherwise keep all the Albedo, Height Map, Detail Mask etc things which are offered by the Standard shader.

So I made a new (surface) shader and opened it and it looks like this:

Shader "Custom/QueueChangerPB" {
    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
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
       
        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;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        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.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

This only has a few of the properties, and doesn’t have that fancy multi compile / shader feature stuff that makes sure it only uses a texture/feature if you’ve filled it in in the inspector.

So my question is, is there a way to get the full Standard shader in Surf form? If not, do I have to add the “Normal Map” Tex and Slider myself and then how do I map them in the surf function?

Cheers!

1 Like

You can download builtin shader here : Download Archive just click on your platform and select Builtin shader.

But if you only want to change the renderqueue on a few object, I would recommand just change material renderqueue in a script : Unity - Scripting API: Material.renderQueue

Well, using the whole shader is definitely a solution, but it has about 100 versions of passes/CG doesn’t it? My instinct tells me that depending on what you want to change it may turn out quite problematic. I think in my case it’s fine though.

and thanks for the renderqueue tip.

Maybe in the future Unity’s shader management toolset will get clever enough to let you wrap the entire (multi compile) Standard shader in a surface shader.

1 Like