git.iko.soy/metal-metaballs
on master help sign in
Removed black dot on the middle of metaballs.
1b31819vinivendra
PixelImage/shaders.metal+8−4
@@ -35,7 +35,8 @@ kernel void
35 float2 metaballPosition = float2(metaball.x, metaball.y);
35 float2 metaballPosition = float2(metaball.x, metaball.y);
36 float2 vector
36 float2 vector
37 = float2(metaballPosition.x - gid.x, metaballPosition.y - gid.y);
37 = float2(metaballPosition.x - gid.x, metaballPosition.y - gid.y);
38− float squaredDistance = dot(vector, vector);
38+ float dotProduct = dot(vector, vector);
39+ float squaredDistance = dotProduct > 0 ? dotProduct : 1;
39 float realDistance = sqrt(squaredDistance);
40 float realDistance = sqrt(squaredDistance);
40 metaballDistances[x - 1] = squaredDistance;
41 metaballDistances[x - 1] = squaredDistance;
41 metaballDirections[x - 1] = vector / realDistance;
42 metaballDirections[x - 1] = vector / realDistance;
@@ -48,7 +49,7 @@ kernel void
48
49
49 for (x = 0; x < numberOfMetaballs; x += 1) {
50 for (x = 0; x < numberOfMetaballs; x += 1) {
50 float distance1 = metaballDistances[x];
51 float distance1 = metaballDistances[x];
51− float value1 = 2048 / (distance1 + 1);
52+ float value1 = 2048 / distance1;
52 float2 direction1 = metaballDirections[x];
53 float2 direction1 = metaballDirections[x];
53
54
54 float colorContribution = 1 / distance1;
55 float colorContribution = 1 / distance1;
@@ -57,7 +58,7 @@ kernel void
57
58
58 for (y = x + 1; y < numberOfMetaballs; y += 1) {
59 for (y = x + 1; y < numberOfMetaballs; y += 1) {
59 float distance2 = metaballDistances[y];
60 float distance2 = metaballDistances[y];
60− float value2 = 2048 / (distance2 + 1);
61+ float value2 = 2048 / distance2;
61 float2 direction2 = metaballDirections[y];
62 float2 direction2 = metaballDirections[y];
62
63
63 float v = value1 + value2;
64 float v = value1 + value2;
@@ -109,8 +110,11 @@ kernel void
109 colorSum = colorSumLink;
110 colorSum = colorSumLink;
110 }
111 }
111
112
112−
113 colorSum *= result;
113 colorSum *= result;
114
114
115+ if (colorSum.r == 0 && colorSum.g == 0 && colorSum.b == 0) {
116+ colorSum = float3(1, 1, 1);
117+ }
118+
115 outTexture.write(float4(colorSum.bgr, 1), gid);
119 outTexture.write(float4(colorSum.bgr, 1), gid);
116}
120}