mostly there

This commit is contained in:
Orion Reed 2024-12-14 14:49:36 -05:00
parent 50c2bd52b8
commit 401ee86c38
1 changed files with 50 additions and 14 deletions

View File

@ -581,6 +581,11 @@ void main() {
const renderFragShader = glsl`#version 300 es const renderFragShader = glsl`#version 300 es
precision mediump float; precision mediump float;
#define DEBUG_MODULO true
#define FALLOFF_FACTOR 10.0
#define SMOOTHING_FACTOR 0.1
#define MERGE_DISTANCES true
in vec2 v_texCoord; in vec2 v_texCoord;
out vec4 outColor; out vec4 outColor;
@ -610,24 +615,55 @@ void main() {
float shapeIDOdd = texelOdd.z; float shapeIDOdd = texelOdd.z;
float distanceOdd = texelOdd.a; float distanceOdd = texelOdd.a;
// Use smooth minimum to merge distances // Compute colors for both shapes first
float k = 0.05; // Smoothing factor, adjust as needed float hueEven = fract(shapeIDEven * 0.61803398875);
float mergedDistance = smoothMin(distanceEven, distanceOdd, k); vec3 colorEven = hsv2rgb(vec3(hueEven, 0.5, 0.95));
// Determine the contributing shape ID based on which distance is closer float hueOdd = fract(shapeIDOdd * 0.61803398875);
float h = clamp(0.5 + 0.5 * (distanceOdd - distanceEven) / k, 0.0, 1.0); vec3 colorOdd = hsv2rgb(vec3(hueOdd, 0.5, 0.95));
float mergedShapeID = mix(shapeIDOdd, shapeIDEven, h);
// Compute color based on the merged shape ID float mergedDistance;
float hue = fract(mergedShapeID * 0.61803398875); // Golden ratio conjugate vec3 mergedColor;
vec3 color = hsv2rgb(vec3(hue, 0.5, 0.95));
// Optionally, you can adjust the brightness based on the merged distance if (MERGE_DISTANCES) {
// For example, fade out colors further from the shapes // Use smooth minimum to merge distances
float brightness = exp(-mergedDistance * 10.0); mergedDistance = smoothMin(distanceEven, distanceOdd, SMOOTHING_FACTOR);
color *= brightness;
// Calculate blend factor using the same smoothing parameter
float h = clamp(0.5 + 0.5 * (distanceOdd - distanceEven) / SMOOTHING_FACTOR, 0.0, 1.0);
// Interpolate between the two colors
mergedColor = mix(colorOdd, colorEven, h);
} else {
// Simply use the closest distance and its corresponding color
if (distanceEven <= distanceOdd) {
mergedDistance = distanceEven;
mergedColor = colorEven;
} else {
mergedDistance = distanceOdd;
mergedColor = colorOdd;
}
}
outColor = vec4(color, 1.0); vec3 finalColor = mergedColor;
if (DEBUG_MODULO) {
// Visualize distance bands using modulo
float bandWidth = 0.02; // Adjust this value to change the width of the bands
float distanceBand = mod(mergedDistance, bandWidth) / bandWidth;
// Create alternating black and white bands
float bandColor = step(0.1, distanceBand);
// Mix the band visualization with the merged color
finalColor = mix(vec3(0.0), mergedColor, bandColor);
}
// Apply intensity-based falloff (from pre-pretty commit)
float intensity = exp(-mergedDistance * FALLOFF_FACTOR);
finalColor *= intensity;
outColor = vec4(finalColor, 1.0);
}`; }`;
/** /**