Search Unity

How can I add the emission property to the Standard Surface Shader?

Discussion in 'Shaders' started by TheSaviour, Jun 26, 2017.

  1. TheSaviour

    TheSaviour

    Joined:
    Apr 20, 2015
    Posts:
    68
    I added a "Standard Surface Shader" by doing the following: Right click in Assets folder (or subfolder) > Create > Shader > Standard Surface Shader. This shader is built-in with Unity and the CG code for this shader pretty much had everything that I needed for the basic texturing, color, smoothness and metallic properties.

    But I want to know how to add the basic emission property that you usually find in the Standard shader whenever you create a new material. I want the shader to have all the functions that the emission property of the Standard shader has. So it needs the boolean variable to turn emission on and off. The color and intensity of the emission, the GI option and the Tiling and Offset variables:

    Emission Property.png

    Here's the code for the built-in Standard Surface Shader:

    Shader "Custom/NewSurfaceShader" {
    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;

    // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
    // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
    // #pragma instancing_options assumeuniformscaling
    UNITY_INSTANCING_CBUFFER_START(Props)
    // put more per-instance properties here
    UNITY_INSTANCING_CBUFFER_END

    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"
    }

    I didn't write any of this code. It's pre-added to Unity.