[app] Fix up the alpha feathering
This commit is contained in:
parent
99fe2147ad
commit
f95ddd4f5c
1 changed files with 18 additions and 11 deletions
|
@ -65,8 +65,8 @@ passthroughVertexShader(uint vid [[vertex_id]],
|
||||||
float sampleAtPoint(float2, constant Ball*, int);
|
float sampleAtPoint(float2, constant Ball*, int);
|
||||||
|
|
||||||
// Color samplers
|
// Color samplers
|
||||||
float4 singleColor(float, float4);
|
float4 singleColor(float, float, float4);
|
||||||
float4 gradient2(float, float, float4, float4);
|
float4 gradient2(float, float, float, float4, float4);
|
||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
float mapValueFromRangeOntoRange(float, float, float, float, float);
|
float mapValueFromRangeOntoRange(float, float, float, float, float);
|
||||||
|
@ -77,24 +77,20 @@ sampleToColorShader(RasterizerData in [[stage_in]],
|
||||||
constant Parameters& parameters [[buffer(0)]],
|
constant Parameters& parameters [[buffer(0)]],
|
||||||
constant Ball* balls [[buffer(1)]])
|
constant Ball* balls [[buffer(1)]])
|
||||||
{
|
{
|
||||||
|
const float target = 1.0;
|
||||||
const float sample = sampleAtPoint(in.position.xy, balls, parameters.numberOfBalls);
|
const float sample = sampleAtPoint(in.position.xy, balls, parameters.numberOfBalls);
|
||||||
const float blend = in.position.x / parameters.size.x;
|
const float blend = in.position.x / parameters.size.x;
|
||||||
|
|
||||||
float4 out;
|
float4 out;
|
||||||
switch (parameters.colorStyle) {
|
switch (parameters.colorStyle) {
|
||||||
case SingleColor:
|
case SingleColor:
|
||||||
out = singleColor(sample, parameters.colors[0]);
|
out = singleColor(sample, target, parameters.colors[0]);
|
||||||
break;
|
break;
|
||||||
case Gradient2Horizontal:
|
case Gradient2Horizontal:
|
||||||
out = gradient2(sample, blend, parameters.colors[0], parameters.colors[1]);
|
out = gradient2(sample, target, blend, parameters.colors[0], parameters.colors[1]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Feather the alpha.
|
|
||||||
const float target = 1.0;
|
|
||||||
const float a = clamp(mapValueFromRangeOntoRange(sample, 0.75 * target, target, 0, 1), 0.0, 1.0);
|
|
||||||
out.w = a;
|
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,19 +112,30 @@ sampleAtPoint(float2 point,
|
||||||
|
|
||||||
float4
|
float4
|
||||||
singleColor(float sample,
|
singleColor(float sample,
|
||||||
|
float target,
|
||||||
float4 color)
|
float4 color)
|
||||||
{
|
{
|
||||||
return sample > 1.0 ? color : float4();
|
float4 out;
|
||||||
|
if (sample > 1.0) {
|
||||||
|
out = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Feather the alpha value.
|
||||||
|
const float a = clamp(mapValueFromRangeOntoRange(sample, 0.75 * target, target, 0, 1), 0.0, 1.0);
|
||||||
|
out = float4(out.xyz, a);
|
||||||
|
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
float4
|
float4
|
||||||
gradient2(float sample,
|
gradient2(float sample,
|
||||||
|
float target,
|
||||||
float normalizedBlend,
|
float normalizedBlend,
|
||||||
float4 fromColor,
|
float4 fromColor,
|
||||||
float4 toColor)
|
float4 toColor)
|
||||||
{
|
{
|
||||||
float4 blendedColor = averageTwoColors(normalizedBlend, fromColor, toColor);
|
float4 blendedColor = averageTwoColors(normalizedBlend, fromColor, toColor);
|
||||||
float4 out = singleColor(sample, blendedColor);
|
float4 out = singleColor(sample, target, blendedColor);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue