Skip to content

Commit

Permalink
[ShaderGraph][Canvas] Option to Disable Tinting
Browse files Browse the repository at this point in the history
https://jira.unity3d.com/browse/UUM-46771

Added target setting to disable the default color tinting behavior for canvas and sprite targets, across built-in, urp, and hdrp (where relevant).

Normally the shader graph output color was getting multiplied by the vertex color in the code generation, but users really need the option to just use the vertex color node to get the UI color and then perform their own color calculations. This created awkward situations where the interactions between UI state and colors was contentious and severely limited various use-cases.
![image](https://media.github.cds.internal.unity3d.com/user/2380/files/59a8a33d-f191-4b59-9cbf-5949409db911)
  • Loading branch information
Esmeralda Salamone authored and Evergreen committed Sep 29, 2023
1 parent 79f9b3f commit 3ca7a6b
Show file tree
Hide file tree
Showing 17 changed files with 290 additions and 103 deletions.
Expand Up @@ -138,8 +138,8 @@ half4 frag(PackedVaryings packedInput) : SV_TARGET
half alpha = surfaceDescription.Alpha;
half4 color = half4(surfaceDescription.BaseColor + surfaceDescription.Emission, alpha) ;

#ifndef HAVE_VFX_MODIFICATION
color *= unpacked.color ;
#if !defined(HAVE_VFX_MODIFICATION) && !defined(_DISABLE_COLOR_TINT)
color *= unpacked.color;
#endif

#ifdef UNITY_UI_CLIP_RECT
Expand Down
Expand Up @@ -43,7 +43,7 @@ half4 frag(PackedVaryings packedInput) : SV_TARGET
}
#endif

#ifndef HAVE_VFX_MODIFICATION
#if !defined(HAVE_VFX_MODIFICATION) && !defined(_DISABLE_COLOR_TINT)
color *= unpacked.color * unity_SpriteColor;
#endif
return color;
Expand Down
Expand Up @@ -50,7 +50,7 @@ half4 frag(PackedVaryings packedInput) : SV_TARGET
clip(color.a - surfaceDescription.AlphaClipThreshold);
#endif

#ifndef HAVE_VFX_MODIFICATION
#if !defined(HAVE_VFX_MODIFICATION) && !defined(_DISABLE_COLOR_TINT)
color *= unpacked.color * unity_SpriteColor;
#endif

Expand Down
Expand Up @@ -50,7 +50,7 @@ half4 frag(PackedVaryings packedInput) : SV_TARGET
}
#endif

#ifndef HAVE_VFX_MODIFICATION
#if !defined(HAVE_VFX_MODIFICATION) && !defined(_DISABLE_COLOR_TINT)
color *= unpacked.color * unity_SpriteColor;
#endif

Expand Down
Expand Up @@ -67,6 +67,16 @@ public static void AddDefaultPropertiesGUI(ref TargetPropertyGUIContext context,
target.alphaClip = evt.newValue;
onChange();
});

context.AddProperty("Disable Color Tint", new Toggle() { value = target.disableTint }, (evt) =>
{
if (Equals(target.disableTint, evt.newValue))
return;
registerUndo("Change Disable Tint");
target.disableTint = evt.newValue;
onChange();
});
}

public static void AddAlphaClipControlToPass(ref PassDescriptor pass, UniversalTarget target)
Expand Down
Expand Up @@ -66,7 +66,7 @@ public static SubShaderDescriptor SpriteLit(UniversalTarget target)
// UI shaders to render correctly. Verify [1352225] before changing this order.
{ CorePasses._2DSceneSelection(target) },
{ CorePasses._2DScenePicking(target) },
{ SpriteLitPasses.Forward },
{ SpriteLitPasses.Forward(target) },
},
};
return result;
Expand Down Expand Up @@ -108,6 +108,9 @@ public static PassDescriptor Lit(UniversalTarget target)
includes = SpriteLitIncludes.Lit,
};

if (target.disableTint)
result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);

SpriteSubTargetUtility.AddAlphaClipControlToPass(ref result, target);

return result;
Expand Down Expand Up @@ -143,41 +146,54 @@ public static PassDescriptor Normal(UniversalTarget target)
includes = SpriteLitIncludes.Normal,
};

if (target.disableTint)
result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);

SpriteSubTargetUtility.AddAlphaClipControlToPass(ref result, target);

return result;
}

public static PassDescriptor Forward = new PassDescriptor
public static PassDescriptor Forward(UniversalTarget target)
{
// Definition
displayName = "Sprite Forward",
referenceName = "SHADERPASS_SPRITEFORWARD",
lightMode = "UniversalForward",
useInPreview = true,

// Template
passTemplatePath = UniversalTarget.kUberTemplatePath,
sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,

// Port Mask
validVertexBlocks = CoreBlockMasks.Vertex,
validPixelBlocks = SpriteLitBlockMasks.FragmentForward,

// Fields
structs = CoreStructCollections.Default,
requiredFields = SpriteLitRequiredFields.Forward,
keywords = SpriteLitKeywords.Forward,
fieldDependencies = CoreFieldDependencies.Default,

// Conditional State
renderStates = CoreRenderStates.Default,
pragmas = CorePragmas._2DDefault,
includes = SpriteLitIncludes.Forward,

// Custom Interpolator Support
customInterpolators = CoreCustomInterpDescriptors.Common
};
var result = new PassDescriptor
{
// Definition
displayName = "Sprite Forward",
referenceName = "SHADERPASS_SPRITEFORWARD",
lightMode = "UniversalForward",
useInPreview = true,

// Template
passTemplatePath = UniversalTarget.kUberTemplatePath,
sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,

// Port Mask
validVertexBlocks = CoreBlockMasks.Vertex,
validPixelBlocks = SpriteLitBlockMasks.FragmentForward,

// Fields
structs = CoreStructCollections.Default,
requiredFields = SpriteLitRequiredFields.Forward,
keywords = SpriteLitKeywords.Forward,
fieldDependencies = CoreFieldDependencies.Default,

// Conditional State
renderStates = CoreRenderStates.Default,
pragmas = CorePragmas._2DDefault,
defines = new DefineCollection(),
includes = SpriteLitIncludes.Forward,

// Custom Interpolator Support
customInterpolators = CoreCustomInterpDescriptors.Common
};

if (target.disableTint)
result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);

return result;

}
}
#endregion

Expand Down
Expand Up @@ -89,7 +89,7 @@ public static SubShaderDescriptor SpriteLit(UniversalTarget target)
// UI shaders to render correctly. Verify [1352225] before changing this order.
{ CorePasses._2DSceneSelection(target) },
{ CorePasses._2DScenePicking(target) },
{ SpriteLitPasses.Forward },
{ SpriteLitPasses.Forward(target) },
},
};
return result;
Expand Down Expand Up @@ -134,6 +134,9 @@ public static PassDescriptor Lit(UniversalTarget target)
customInterpolators = CoreCustomInterpDescriptors.Common
};

if (target.disableTint)
result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);

SpriteSubTargetUtility.AddAlphaClipControlToPass(ref result, target);

return result;
Expand Down Expand Up @@ -172,41 +175,53 @@ public static PassDescriptor Normal(UniversalTarget target)
customInterpolators = CoreCustomInterpDescriptors.Common
};

if (target.disableTint)
result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);

SpriteSubTargetUtility.AddAlphaClipControlToPass(ref result, target);

return result;
}

public static PassDescriptor Forward = new PassDescriptor
public static PassDescriptor Forward(UniversalTarget target)
{
// Definition
displayName = "Sprite Forward",
referenceName = "SHADERPASS_SPRITEFORWARD",
lightMode = "UniversalForward",
useInPreview = true,

// Template
passTemplatePath = UniversalTarget.kUberTemplatePath,
sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,

// Port Mask
validVertexBlocks = CoreBlockMasks.Vertex,
validPixelBlocks = SpriteLitBlockMasks.FragmentForwardNormal,

// Fields
structs = CoreStructCollections.Default,
requiredFields = SpriteLitRequiredFields.Forward,
keywords = SpriteLitKeywords.Forward,
fieldDependencies = CoreFieldDependencies.Default,

// Conditional State
renderStates = CoreRenderStates.Default,
pragmas = CorePragmas._2DDefault,
includes = SpriteLitIncludes.Forward,

// Custom Interpolator Support
customInterpolators = CoreCustomInterpDescriptors.Common
};
var result = new PassDescriptor
{
// Definition
displayName = "Sprite Forward",
referenceName = "SHADERPASS_SPRITEFORWARD",
lightMode = "UniversalForward",
useInPreview = true,

// Template
passTemplatePath = UniversalTarget.kUberTemplatePath,
sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,

// Port Mask
validVertexBlocks = CoreBlockMasks.Vertex,
validPixelBlocks = SpriteLitBlockMasks.FragmentForwardNormal,

// Fields
structs = CoreStructCollections.Default,
requiredFields = SpriteLitRequiredFields.Forward,
keywords = SpriteLitKeywords.Forward,
fieldDependencies = CoreFieldDependencies.Default,

// Conditional State
renderStates = CoreRenderStates.Default,
pragmas = CorePragmas._2DDefault,
defines = new DefineCollection(),
includes = SpriteLitIncludes.Forward,

// Custom Interpolator Support
customInterpolators = CoreCustomInterpDescriptors.Common
};

if (target.disableTint)
result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);

return result;
}
}
#endregion

Expand Down
Expand Up @@ -83,7 +83,7 @@ public static SubShaderDescriptor SpriteUnlit(UniversalTarget target)
// UI shaders to render correctly. Verify [1352225] before changing this order.
{ CorePasses._2DSceneSelection(target) },
{ CorePasses._2DScenePicking(target) },
{ SpriteUnlitPasses.Forward },
{ SpriteUnlitPasses.Forward(target) },
},
};
return result;
Expand Down Expand Up @@ -129,41 +129,53 @@ public static PassDescriptor Unlit(UniversalTarget target)
customInterpolators = CoreCustomInterpDescriptors.Common
};

if (target.disableTint)
result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);

SpriteSubTargetUtility.AddAlphaClipControlToPass(ref result, target);

return result;
}

public static PassDescriptor Forward = new PassDescriptor
public static PassDescriptor Forward(UniversalTarget target)
{
// Definition
displayName = "Sprite Unlit",
referenceName = "SHADERPASS_SPRITEFORWARD",
lightMode = "UniversalForward",
useInPreview = true,

// Template
passTemplatePath = UniversalTarget.kUberTemplatePath,
sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,

// Port Mask
validVertexBlocks = CoreBlockMasks.Vertex,
validPixelBlocks = SpriteUnlitBlockMasks.Fragment,

// Fields
structs = CoreStructCollections.Default,
requiredFields = SpriteUnlitRequiredFields.Unlit,
fieldDependencies = CoreFieldDependencies.Default,

// Conditional State
renderStates = CoreRenderStates.Default,
pragmas = CorePragmas._2DDefault,
keywords = SpriteUnlitKeywords.Unlit,
includes = SpriteUnlitIncludes.Unlit,

// Custom Interpolator Support
customInterpolators = CoreCustomInterpDescriptors.Common
};
var result = new PassDescriptor
{
// Definition
displayName = "Sprite Unlit",
referenceName = "SHADERPASS_SPRITEFORWARD",
lightMode = "UniversalForward",
useInPreview = true,

// Template
passTemplatePath = UniversalTarget.kUberTemplatePath,
sharedTemplateDirectories = UniversalTarget.kSharedTemplateDirectories,

// Port Mask
validVertexBlocks = CoreBlockMasks.Vertex,
validPixelBlocks = SpriteUnlitBlockMasks.Fragment,

// Fields
structs = CoreStructCollections.Default,
requiredFields = SpriteUnlitRequiredFields.Unlit,
fieldDependencies = CoreFieldDependencies.Default,

// Conditional State
renderStates = CoreRenderStates.Default,
pragmas = CorePragmas._2DDefault,
defines = new(),
keywords = SpriteUnlitKeywords.Unlit,
includes = SpriteUnlitIncludes.Unlit,

// Custom Interpolator Support
customInterpolators = CoreCustomInterpDescriptors.Common
};

if (target.disableTint)
result.defines.Add(Canvas.ShaderGraph.CanvasSubTarget<Target>.CanvasKeywords.DisableTint, 1);

return result;
}
}
#endregion

Expand Down
Expand Up @@ -130,8 +130,8 @@ half4 frag(PackedVaryings packedInput) : SV_TARGET
half alpha = surfaceDescription.Alpha;
half4 color = half4(surfaceDescription.BaseColor + surfaceDescription.Emission, alpha) ;

#ifndef HAVE_VFX_MODIFICATION
color *= unpacked.color ;
#if !defined(HAVE_VFX_MODIFICATION) && !defined(_DISABLE_COLOR_TINT)
color *= unpacked.color;
#endif

#ifdef UNITY_UI_CLIP_RECT
Expand Down
Expand Up @@ -46,6 +46,8 @@ protected override DefineCollection GetAdditionalDefines()
var result = new DefineCollection();
if (canvasData.alphaClip)
result.Add(CoreKeywordDescriptors.AlphaTestOn, 1);

result.Add(base.GetAdditionalDefines());
return result;
}

Expand All @@ -58,7 +60,7 @@ public override void GetActiveBlocks(ref TargetActiveBlockContext context)
public override void GetFields(ref TargetFieldContext context)
{
base.GetFields(ref context);
if(canvasData.alphaClip)
if (canvasData.alphaClip)
context.AddField(UnityEditor.ShaderGraph.Fields.AlphaTest);
}
public override void CollectShaderProperties(PropertyCollector collector, GenerationMode generationMode)
Expand Down

0 comments on commit 3ca7a6b

Please sign in to comment.