[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);
 | 
			
		||||
 | 
			
		||||
// Color samplers
 | 
			
		||||
float4 singleColor(float, float4);
 | 
			
		||||
float4 gradient2(float, float, float4, float4);
 | 
			
		||||
float4 singleColor(float, float, float4);
 | 
			
		||||
float4 gradient2(float, float, float, float4, float4);
 | 
			
		||||
 | 
			
		||||
// Helpers
 | 
			
		||||
float mapValueFromRangeOntoRange(float, float, float, float, float);
 | 
			
		||||
| 
						 | 
				
			
			@ -77,24 +77,20 @@ sampleToColorShader(RasterizerData in               [[stage_in]],
 | 
			
		|||
                    constant Parameters& parameters [[buffer(0)]],
 | 
			
		||||
                    constant Ball* balls            [[buffer(1)]])
 | 
			
		||||
{
 | 
			
		||||
    const float target = 1.0;
 | 
			
		||||
    const float sample = sampleAtPoint(in.position.xy, balls, parameters.numberOfBalls);
 | 
			
		||||
    const float blend = in.position.x / parameters.size.x;
 | 
			
		||||
 | 
			
		||||
    float4 out;
 | 
			
		||||
    switch (parameters.colorStyle) {
 | 
			
		||||
        case SingleColor:
 | 
			
		||||
            out = singleColor(sample, parameters.colors[0]);
 | 
			
		||||
            out = singleColor(sample, target, parameters.colors[0]);
 | 
			
		||||
            break;
 | 
			
		||||
        case Gradient2Horizontal:
 | 
			
		||||
            out = gradient2(sample, blend, parameters.colors[0], parameters.colors[1]);
 | 
			
		||||
            out = gradient2(sample, target, blend, parameters.colors[0], parameters.colors[1]);
 | 
			
		||||
            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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -116,19 +112,30 @@ sampleAtPoint(float2 point,
 | 
			
		|||
 | 
			
		||||
float4
 | 
			
		||||
singleColor(float sample,
 | 
			
		||||
            float target,
 | 
			
		||||
            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
 | 
			
		||||
gradient2(float sample,
 | 
			
		||||
          float target,
 | 
			
		||||
          float normalizedBlend,
 | 
			
		||||
          float4 fromColor,
 | 
			
		||||
          float4 toColor)
 | 
			
		||||
{
 | 
			
		||||
    float4 blendedColor = averageTwoColors(normalizedBlend, fromColor, toColor);
 | 
			
		||||
    float4 out = singleColor(sample, blendedColor);
 | 
			
		||||
    float4 out = singleColor(sample, target, blendedColor);
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue