Shader "Unlit/HPBar"
{
Properties
{
_Health("Health", Range(0, 1)) = 0
_LowColor("Low Health Color", Color) = (1,0,0,1)
_HighColor("High Health Color", Color) = (0,1,0,1)
_BackgroundColor("Background Color", Color) = (1,1,1,1)
_FrameColor("Frame Color", Color) = (1,1,1,1)
_Outline("Frame Thickness", Range(0, 5)) = 1
}
SubShader
{
Tags
{
"RenderType" = "Opaque"
"IgnoreProjector" = "True"
"RenderPipeline" = "UniversalPipeline"
}
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#pragma vertex vert
#pragma fragment frag
ENDHLSL
Pass
{
Name "Unlit"
Tags
{
"LightMode" = "UniversalForward"
}
HLSLPROGRAM
#pragma multi_compile_instancing
#pragma instancing_options renderinglayer
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
float2 uv : TEXCOORD0;
float4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float2 uv : TEXCOORD0;
float4 positionHCS : SV_POSITION;
float4 color : COLOR;
};
CBUFFER_START(UnityPerMaterial)
float4 _LowColor;
float4 _HighColor;
float4 _BackgroundColor;
float4 _FrameColor;
float _Outline;
CBUFFER_END
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float, _Health)
UNITY_INSTANCING_BUFFER_END(Props)
Varyings vert(Attributes IN)
{
Varyings OUT;
UNITY_SETUP_INSTANCE_ID(IN);
UNITY_TRANSFER_INSTANCE_ID(IN, OUT);
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
OUT.uv = IN.uv;
OUT.color = IN.color;
if (IN.color.g > 0.5 && IN.color.r < 0.5 && IN.color.b < 0.5)
{
IN.positionOS.xyz += IN.normalOS.xyz * _Outline;
VertexPositionInputs vertexInput = GetVertexPositionInputs(IN.positionOS.xyz);
OUT.positionHCS = vertexInput.positionCS;
}
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(IN);
if (IN.color.g > 0.5 && IN.color.r < 0.5 && IN.color.b < 0.5)
{
return _FrameColor;
}
if (IN.uv.x > UNITY_ACCESS_INSTANCED_PROP(Props, _Health))
{
return _BackgroundColor;
}
return lerp(_LowColor, _HighColor, UNITY_ACCESS_INSTANCED_PROP(Props, _Health));
}
ENDHLSL
}
Pass
{
Name "DepthOnly"
Tags
{
"LightMode" = "DepthOnly"
}
ZWrite On
ColorMask 0
HLSLPROGRAM
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
float2 uv : TEXCOORD0;
float4 color : COLOR;
};
struct Varyings
{
float2 uv : TEXCOORD0;
float4 positionHCS : SV_POSITION;
float4 color : COLOR;
};
CBUFFER_START(UnityPerMaterial)
float4 _LowColor;
float4 _HighColor;
float4 _BackgroundColor;
float4 _FrameColor;
float _Outline;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
OUT.uv = IN.uv;
OUT.color = IN.color;
if (IN.color.g > 0.5 && IN.color.r < 0.5 && IN.color.b < 0.5)
{
IN.positionOS.xyz += IN.normalOS.xyz * _Outline;
VertexPositionInputs vertexInput = GetVertexPositionInputs(IN.positionOS.xyz);
OUT.positionHCS = vertexInput.positionCS;
}
return OUT;
}
float4 frag (Varyings IN) : SV_Target
{
return 0;
}
ENDHLSL
}
Pass
{
Name "DepthNormals"
Tags
{
"LightMode" = "DepthNormals"
}
ZWrite On
ColorMask 0
HLSLPROGRAM
struct Attributes
{
float4 positionOS : POSITION;
float3 normalOS : NORMAL;
float2 uv : TEXCOORD0;
float4 color : COLOR;
};
struct Varyings
{
float2 uv : TEXCOORD0;
float4 positionHCS : SV_POSITION;
float4 color : COLOR;
};
CBUFFER_START(UnityPerMaterial)
float4 _LowColor;
float4 _HighColor;
float4 _BackgroundColor;
float4 _FrameColor;
float _Outline;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
OUT.color = IN.color;
OUT.uv = IN.uv;
if (IN.color.g > 0.5 && IN.color.r < 0.5 && IN.color.b < 0.5)
{
IN.positionOS.xyz += IN.normalOS.xyz * _Outline;
VertexPositionInputs vertexInput = GetVertexPositionInputs(IN.positionOS.xyz);
OUT.positionHCS = vertexInput.positionCS;
}
return OUT;
}
float4 frag(Varyings IN) : SV_Target
{
return 0;
}
ENDHLSL
}
}
}
All I need is _Health to be instanced, I haven’t done this before it’s my first HLSL shader outside of NodeBasedEditors