- Home /
 
Customize Standard Shader Light Rig - Help
Hi im trying to add a small customization to the new Standard Shader Light rig but im stuck.
I have downloaded the builtin shaders and found "what I thought" is the Standard light setup from inside the file called "UnityPBSLighting.cginc" and placed it into my shader but I cant get it to work?.... Am I doing anything wrong here?
 Shader "Transparent/Alpha Test" {
 Properties {
     _Color ("Main Color", Color) = (1,1,1,1)
     _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
     _BumpMap ("Normalmap", 2D) = "bump" {}
 }
 
 SubShader {
     Tags {"Queue"="Transparent-1" "IgnoreProjector"="True" "RenderType"="Transparent"}
     LOD 300
     Cull Off
     
 CGPROGRAM
 #pragma surface surf CustomStandard alpha:fade noforwardadd
 
     inline half4 LightingCustomStandard (SurfaceOutputStandard s, half3 viewDir, UnityGI gi)
     {
         s.Normal = normalize(s.Normal);
 
         half oneMinusReflectivity;
         half3 specColor;
         s.Albedo = DiffuseAndSpecularFromMetallic (s.Albedo, s.Metallic, /*out*/ specColor, /*out*/ oneMinusReflectivity);
 
         // shader relies on pre-multiply alpha-blend (_SrcBlend = One, _DstBlend = OneMinusSrcAlpha)
         // this is necessary to handle transparency in physically correct way - only diffuse component gets affected by alpha
         half outputAlpha;
         s.Albedo = PreMultiplyAlpha (s.Albedo, s.Alpha, oneMinusReflectivity, /*out*/ outputAlpha);
 
         half4 c = UNITY_BRDF_PBS (s.Albedo, specColor, oneMinusReflectivity, s.Smoothness, s.Normal, viewDir, gi.light, gi.indirect);
         c.rgb += UNITY_BRDF_GI (s.Albedo, specColor, oneMinusReflectivity, s.Smoothness, s.Normal, viewDir, s.Occlusion, gi);
         c.a = outputAlpha;
         return c;
     }
 
     sampler2D _MainTex;
     sampler2D _BumpMap;
     fixed4 _Color;
 
     struct Input {
         float2 uv_MainTex;
         float2 uv_BumpMap;
     };
 
     void surf (Input IN, inout SurfaceOutputStandard o) {
         fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
         o.Albedo = c.rgb;
         o.Alpha = c.a;
         o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
     }
     ENDCG
     }
 }
 
               I get syntax errors on these lines from the above code
"inline half4 LightingCustomStandard (SurfaceOutputStandard s, half3 viewDir, UnityGI gi)"
"void surf (Input IN, inout SurfaceOutputStandard o) {"
"fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;"
Am I missing something or is this just all wrong?
Answer by Earlybird · May 05, 2015 at 10:07 AM
The new standard light rig requires a GI function to work correctly, also I needed to include the UnityPBSLighting.cginc file and now its working
The pragma should look something like this:
 #pragma surface surf CustomStandard fullforwardshadows
 #include "UnityPBSLighting.cginc"
 
               This is the light rig and gi function I copied from the above file which you can customize as required.
         inline half4 LightingCustomStandard (SurfaceOutputStandard s, half3 viewDir, UnityGI gi)
         {
             s.Normal = normalize(s.Normal);
 
             half oneMinusReflectivity;
             half3 specColor;
             s.Albedo = DiffuseAndSpecularFromMetallic (s.Albedo, s.Metallic, /*out*/ specColor, /*out*/ oneMinusReflectivity);
 
             // shader relies on pre-multiply alpha-blend (_SrcBlend = One, _DstBlend = OneMinusSrcAlpha)
             // this is necessary to handle transparency in physically correct way - only diffuse component gets affected by alpha
             half outputAlpha;
             s.Albedo = PreMultiplyAlpha (s.Albedo, s.Alpha, oneMinusReflectivity, /*out*/ outputAlpha);
             //Added a Power Ramp to allow the ability to adjust the lighting through the material
             half4 c = UNITY_BRDF_PBS (s.Albedo, specColor, oneMinusReflectivity, s.Smoothness, s.Normal, viewDir, gi.light, gi.indirect);
             c.rgb += UNITY_BRDF_GI (s.Albedo, specColor, oneMinusReflectivity, s.Smoothness, s.Normal, viewDir, s.Occlusion, gi);
             c.a = outputAlpha;
             return c;
         }
         
         //New Standard Lighting model requires a GI function
         inline void LightingCustomStandard_GI (
             SurfaceOutputStandard s,
             UnityGIInput data,
             inout UnityGI gi)
         {
             gi = UnityGlobalIllumination (data, s.Occlusion, s.Smoothness, s.Normal);
         }
 
               At least this is working for me :)
Your answer
 
             Follow this Question
Related Questions
Light color in a fragment shader? 0 Answers
Point Lights only displaying in editor on custom shader 0 Answers
Terrain + Standard shader? 1 Answer
How do I make this shader accept the default unity lighting? 3 Answers
Marmoset + Unity 4 vs Unity 5 Lighting 0 Answers