67 lines
2.4 KiB
HLSL
67 lines
2.4 KiB
HLSL
#if SHADERPASS != SHADERPASS_CUSTOM_UI
|
|
#error SHADERPASS_CUSTOM_UI_is_not_correctly_defined
|
|
#endif
|
|
|
|
|
|
#define UIE_NOINTERPOLATION nointerpolation
|
|
|
|
PackedVaryings uie_custom_vert(Attributes input)
|
|
{
|
|
appdata_t uieInput = (appdata_t)0;
|
|
uieInput.vertex = float4(input.positionOS, 1.0f);
|
|
uieInput.color = input.color;
|
|
uieInput.uv = input.uv0;
|
|
uieInput.xformClipPages = input.uv1;
|
|
uieInput.ids = input.uv2;
|
|
uieInput.flags = input.uv3;
|
|
uieInput.opacityColorPages = input.uv4;
|
|
uieInput.settingIndex = input.uv5;
|
|
uieInput.circle = input.uv6;
|
|
uieInput.textureId = input.uv7.x;
|
|
|
|
v2f uieOutput = uie_std_vert(uieInput);
|
|
|
|
Varyings varyings = (Varyings)0;
|
|
varyings.positionCS = uieOutput.pos;
|
|
|
|
#ifdef VARYINGS_NEED_POSITION_WS
|
|
float3 positionWS = TransformObjectToWorld(input.positionOS);
|
|
varyings.positionWS = positionWS;
|
|
#endif
|
|
|
|
varyings.color = uieOutput.color;
|
|
varyings.texCoord0 = uieOutput.uvClip;
|
|
varyings.texCoord1 = uieOutput.typeTexSettings;
|
|
varyings.texCoord3 = float4(uieOutput.textCoreLoc.x, uieOutput.textCoreLoc.y, input.uv0.z, input.uv0.w); // Layout uv in z, w
|
|
varyings.texCoord4 = uieOutput.circle;
|
|
|
|
PackedVaryings packedOutput = PackVaryings(varyings);
|
|
return packedOutput;
|
|
}
|
|
|
|
UIE_FRAG_T uie_custom_frag(PackedVaryings packedInput) : SV_Target
|
|
{
|
|
Varyings varyings = UnpackVaryings(packedInput);
|
|
SurfaceDescriptionInputs surfaceDescriptionInputs = BuildSurfaceDescriptionInputs(varyings);
|
|
|
|
SurfaceDescription surfaceDescription = SurfaceDescriptionFunction(surfaceDescriptionInputs);
|
|
|
|
// TODO: In the future, we should try to use surfaceDescription.coverage instead of computing coverage outside
|
|
// of the branches like we do here.
|
|
half renderType = round(surfaceDescriptionInputs.typeTexSettings.x);
|
|
half isArc = surfaceDescriptionInputs.typeTexSettings.w;
|
|
float2 outer = surfaceDescriptionInputs.circle.xy;
|
|
float2 inner = surfaceDescriptionInputs.circle.zw;
|
|
float coverage = uie_sg_compute_aa_coverage(renderType, isArc, outer, inner);
|
|
|
|
coverage *= uie_fragment_clip(surfaceDescriptionInputs.uvClip.zw);
|
|
|
|
// Clip fragments when coverage is close to 0 (< 1/256 here).
|
|
// This will write proper masks values in the stencil buffer.
|
|
clip(coverage - 0.003f);
|
|
|
|
surfaceDescription.Alpha *= coverage;
|
|
|
|
return float4(surfaceDescription.BaseColor, surfaceDescription.Alpha);
|
|
}
|