adding to standard shader (i cant get it to work)

hi all,
ive got the billboard shader to work (code below), but i need some of the qualities of the standard shader - transparency and emmisive, so i thought id add the code from the billboard to the standard shader )or maybe the ‘particles/anim alpha blended’, but it doesnt work, it doesnt seem to do anything different - im not sure why?
i downloaded the source code for the standard shader, and added the billboard code in as i thought it should be, with the Pass in the billboard code, added as an extra pass, but maybe there’s more to it than that?

can anyone help?
below is the billboard code, and below that is my attempt to add the billboard code to the standard shader:

Shader “Cg shader for billboards” {
Properties {
_MainTex (“Texture Image”, 2D) = “white” {}
_ScaleX (“Scale X”, Float) = 1.0
_ScaleY (“Scale Y”, Float) = 1.0
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

// User-specified uniforms
uniform sampler2D _MainTex;
uniform float _ScaleX;
uniform float _ScaleY;

struct vertexInput {
float4 vertex : POSITION;
float4 tex : TEXCOORD0;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 tex : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;

output.pos = mul(UNITY_MATRIX_P,
mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))

  • float4(input.vertex.x, input.vertex.y, 0.0, 0.0)
  • float4(_ScaleX, _ScaleY, 1.0, 1.0));
    output.tex = input.tex;

return output;
}
float4 frag(vertexOutput input) : COLOR
{
return tex2D(_MainTex, float2(input.tex.xy));
}
ENDCG
}
}
}

Shader “this billboard shader+standard shader” {

Properties
{
_Color(“Color”, Color) = (1,1,1,1)
_MainTex(“Albedo”, 2D) = “white” {}

_Cutoff(“Alpha Cutoff”, Range(0.0, 1.0)) = 0.5

_Glossiness(“Smoothness”, Range(0.0, 1.0)) = 0.5
_GlossMapScale(“Smoothness Scale”, Range(0.0, 1.0)) = 1.0
[Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel (“Smoothness texture channel”, Float) = 0

[Gamma] _Metallic(“Metallic”, Range(0.0, 1.0)) = 0.0
_MetallicGlossMap(“Metallic”, 2D) = “white” {}

[ToggleOff] _SpecularHighlights(“Specular Highlights”, Float) = 1.0
[ToggleOff] _GlossyReflections(“Glossy Reflections”, Float) = 1.0

_BumpScale(“Scale”, Float) = 1.0
_BumpMap(“Normal Map”, 2D) = “bump” {}

_Parallax (“Height Scale”, Range (0.005, 0.08)) = 0.02
_ParallaxMap (“Height Map”, 2D) = “black” {}

_OcclusionStrength(“Strength”, Range(0.0, 1.0)) = 1.0
_OcclusionMap(“Occlusion”, 2D) = “white” {}

_EmissionColor(“Color”, Color) = (0,0,0)
_EmissionMap(“Emission”, 2D) = “white” {}

_DetailMask(“Detail Mask”, 2D) = “white” {}

_DetailAlbedoMap(“Detail Albedo x2”, 2D) = “grey” {}
_DetailNormalMapScale(“Scale”, Float) = 1.0
_DetailNormalMap(“Normal Map”, 2D) = “bump” {}

[Enum(UV0,0,UV1,1)] _UVSec (“UV Set for secondary textures”, Float) = 0
_ScaleX (“Scale X”, Float) = 1.0
_ScaleY (“Scale Y”, Float) = 1.0

// Blending state
[HideInInspector] _Mode (“__mode”, Float) = 0.0
[HideInInspector] _SrcBlend (“__src”, Float) = 1.0
[HideInInspector] _DstBlend (“__dst”, Float) = 0.0
[HideInInspector] _ZWrite (“__zw”, Float) = 1.0
}

CGINCLUDE
#define UNITY_SETUP_BRDF_INPUT MetallicSetup
ENDCG

SubShader
{
Tags { “RenderType”=“Opaque” “PerformanceChecks”=“False” }
LOD 300

// ------------------------------------------------------------------
// Base forward pass (directional light, emission, lightmaps, …)
Pass
{
Name “FORWARD”
Tags { “LightMode” = “ForwardBase” }

Blend [_SrcBlend] [_DstBlend]
ZWrite [_ZWrite]

CGPROGRAM
#pragma target 3.0

// -------------------------------------

#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
#pragma shader_feature _PARALLAXMAP

#pragma multi_compile_fwdbase
#pragma multi_compile_fog
#pragma multi_compile_instancing
// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
//#pragma multi_compile _ LOD_FADE_CROSSFADE

#pragma vertex vertBase
#pragma fragment fragBase

#include “UnityStandardCoreForward.cginc”

ENDCG
}
// ------------------------------------------------------------------
// Additive forward pass (one light per pass)
Pass
{
Name “FORWARD_DELTA”
Tags { “LightMode” = “ForwardAdd” }
Blend [_SrcBlend] One
Fog { Color (0,0,0,0) } // in additive pass fog should be black
ZWrite Off
ZTest LEqual

CGPROGRAM
#pragma target 3.0

// -------------------------------------

#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _PARALLAXMAP

#pragma multi_compile_fwdadd_fullshadows
#pragma multi_compile_fog
// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
//#pragma multi_compile _ LOD_FADE_CROSSFADE

#pragma vertex vertAdd
#pragma fragment fragAdd
#include “UnityStandardCoreForward.cginc”

ENDCG
}
// ------------------------------------------------------------------
// Shadow rendering pass
Pass {
Name “ShadowCaster”
Tags { “LightMode” = “ShadowCaster” }

ZWrite On ZTest LEqual

CGPROGRAM
#pragma target 3.0

// -------------------------------------

#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _PARALLAXMAP
#pragma multi_compile_shadowcaster
#pragma multi_compile_instancing
// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
//#pragma multi_compile _ LOD_FADE_CROSSFADE

#pragma vertex vertShadowCaster
#pragma fragment fragShadowCaster

#include “UnityStandardShadow.cginc”

ENDCG
}
// ------------------------------------------------------------------
// Deferred pass
Pass
{
Name “DEFERRED”
Tags { “LightMode” = “Deferred” }

CGPROGRAM
#pragma target 3.0
#pragma exclude_renderers nomrt

// -------------------------------------

#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature _PARALLAXMAP

#pragma multi_compile_prepassfinal
#pragma multi_compile_instancing
// Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
//#pragma multi_compile _ LOD_FADE_CROSSFADE

#pragma vertex vertDeferred
#pragma fragment fragDeferred

#include “UnityStandardCore.cginc”

ENDCG
}

// ------------------------------------------------------------------
// Extracts information for lightmapping, GI (emission, albedo, …)
// This pass it not used during regular rendering.
Pass
{
Name “META”
Tags { “LightMode”=“Meta” }

Cull Off

CGPROGRAM
#pragma vertex vert_meta
#pragma fragment frag_meta

#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature EDITOR_VISUALIZATION

#include “UnityStandardMeta.cginc”
ENDCG
}
}

SubShader
{
Tags { “RenderType”=“Opaque” “PerformanceChecks”=“False” }
LOD 150

// ------------------------------------------------------------------
// Base forward pass (directional light, emission, lightmaps, …)
Pass
{
Name “FORWARD”
Tags { “LightMode” = “ForwardBase” }

Blend [_SrcBlend] [_DstBlend]
ZWrite [_ZWrite]

CGPROGRAM
#pragma target 2.0

#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature _ _GLOSSYREFLECTIONS_OFF
// SM2.0: NOT SUPPORTED shader_feature ___ _DETAIL_MULX2
// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP

#pragma skip_variants SHADOWS_SOFT DIRLIGHTMAP_COMBINED

#pragma multi_compile_fwdbase
#pragma multi_compile_fog

#pragma vertex vertBase
#pragma fragment fragBase
#include “UnityStandardCoreForward.cginc”

ENDCG
}
// ------------------------------------------------------------------
// Additive forward pass (one light per pass)
Pass
{
Name “FORWARD_DELTA”
Tags { “LightMode” = “ForwardAdd” }
Blend [_SrcBlend] One
Fog { Color (0,0,0,0) } // in additive pass fog should be black
ZWrite Off
ZTest LEqual

CGPROGRAM
#pragma target 2.0

#pragma shader_feature _NORMALMAP
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _ _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature ___ _DETAIL_MULX2
// SM2.0: NOT SUPPORTED shader_feature _PARALLAXMAP
#pragma skip_variants SHADOWS_SOFT

#pragma multi_compile_fwdadd_fullshadows
#pragma multi_compile_fog

#pragma vertex vertAdd
#pragma fragment fragAdd
#include “UnityStandardCoreForward.cginc”

ENDCG
}
// ------------------------------------------------------------------
// Shadow rendering pass
Pass {
Name “ShadowCaster”
Tags { “LightMode” = “ShadowCaster” }

ZWrite On ZTest LEqual

CGPROGRAM
#pragma target 2.0

#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
#pragma shader_feature _METALLICGLOSSMAP
#pragma skip_variants SHADOWS_SOFT
#pragma multi_compile_shadowcaster

#pragma vertex vertShadowCaster
#pragma fragment fragShadowCaster

#include “UnityStandardShadow.cginc”

ENDCG
}

// ------------------------------------------------------------------
// Extracts information for lightmapping, GI (emission, albedo, …)
// This pass it not used during regular rendering.
Pass
{
Name “META”
Tags { “LightMode”=“Meta” }

Cull Off

CGPROGRAM
#pragma vertex vert_meta
#pragma fragment frag_meta

#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature ___ _DETAIL_MULX2
#pragma shader_feature EDITOR_VISUALIZATION

#include “UnityStandardMeta.cginc”
ENDCG
}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

// User-specified uniforms
uniform sampler2D _MainTex;
uniform float _ScaleX;
uniform float _ScaleY;

struct vertexInput {
float4 vertex : POSITION;
float4 tex : TEXCOORD0;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 tex : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;

output.pos = mul(UNITY_MATRIX_P,
mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))

  • float4(input.vertex.x, input.vertex.y, 0.0, 0.0)
  • float4(_ScaleX, _ScaleY, 1.0, 1.0));
    output.tex = input.tex;

return output;
}
float4 frag(vertexOutput input) : COLOR
{
return tex2D(_MainTex, float2(input.tex.xy));
}
ENDCG
}
}

FallBack “VertexLit”
CustomEditor “StandardShaderGUI”
}
[/code]

Just adding code into the end of the standard shader isn’t going to do anything. The standard shader is a monstrously complex bit of code with most of the functionality hidden away in other files. Unless you have an intimate understanding of shaders and Unity’s ShaderLab files, modifying the standard shader isn’t something you’re going to want to attempt.

I would suggest reading through all 5 parts of this tutorial to get a better understanding of shaders:

Then do your billboarding in a surface shader:

I can attest to the “monstrously complex” issues of modifying the standard shader. (and am tired of manually doing detective work through 20 files and 100 passes each time I need something custom, or the standard shaders get an update)

Is there a toolset that anyone uses to track and expose key parts of the standard shader? As in, insert a “shader file” inside all fragment shaders of the standard shader at the end of the fragment function? Would that be a thing coming in unity 2018 maybe with its node based shader stuff?

@tomaszek how did you wrangle the standard shader beast for customizing it? Did you just do it “with your bare hands”? Or actually, can I just edit the Uber shader code instead of bothering with unity’s codebase? Is that easier? Where can I get started with editing (adding code to) Uber? :slight_smile:

Yes, knocked this down with bare hands brute force… Encapsulated some functions in my custom cginc file. I believe it can be still a lot better modularized. To put “something” at the end of frag - open StandardCore.cginc - there are all vert/frag functions placed.

Tom

1 Like

Best to follow the catlike coding set of rendering tutorials, he builds the standard shader from scratch and it ends up better performance wise :wink:

EDIT: http://catlikecoding.com/unity/tutorials/

1 Like