Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 18 additions & 17 deletions examples/shaders/resources/shaders/glsl100/mandelbrot_set.fs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ uniform int maxIterations; // Max iterations per pixel
const float max = 4.0; // We consider infinite as 4.0: if a point reaches a distance of 4.0 it will escape to infinity
const float max2 = max*max; // Square of max to avoid computing square root

// WebGL shaders for loop iteration limit only const
const int maxIterationsLimit = 20000;

void main()
{
// The pixel coordinates are scaled so they are on the mandelbrot scale
Expand All @@ -31,31 +34,29 @@ void main()
// Fc(z) = z^2 + c on the complex numbers c from the plane does not diverge to infinity starting at z = 0
// Here: z = a + bi. Iterations: z -> z^2 + c = (a + bi)^2 + (c.x + c.yi) = (a^2 - b^2 + c.x) + (2ab + c.y)i

int iter = 0;
while (iter < maxIterations)
for (int iter = 0; iter < maxIterationsLimit; ++iter)
{
float aa = a*a;
float bb = b*b;
if (iter >= maxIterations)
{
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
return;
}
if (aa + bb > max2)
break;
{
float normR = float(iter - (iter/55)*55)/55.0;
float normG = float(iter - (iter/69)*69)/69.0;
float normB = float(iter - (iter/40)*40)/40.0;

gl_FragColor = vec4(sin(normR*PI), sin(normG*PI), sin(normB*PI), 1.0);
return;
}

float twoab = 2.0*a*b;
a = aa - bb + c.x;
b = twoab + c.y;

++iter;
}

if (iter >= maxIterations)
{
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
}
else
{
float normR = float(iter - (iter/55)*55)/55.0;
float normG = float(iter - (iter/69)*69)/69.0;
float normB = float(iter - (iter/40)*40)/40.0;

gl_FragColor = vec4(sin(normR*PI), sin(normG*PI), sin(normB*PI), 1.0);
}
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
}
5 changes: 5 additions & 0 deletions examples/shaders/shaders_mandelbrot_set.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,13 @@ int main(void)
float zoom = startingZoom;
// Depending on the zoom the mximum number of iterations must be adapted to get more detail as we zzoom in
// The solution is not perfect, so a control has been added to increase/decrease the number of iterations with UP/DOWN keys
#if defined(PLATFORM_DESKTOP)
int maxIterations = 333;
float maxIterationsMultiplier = 166.5f;
#else
int maxIterations = 43;
float maxIterationsMultiplier = 22.0f;
#endif

// Get variable (uniform) locations on the shader to connect with the program
// NOTE: If uniform variable could not be found in the shader, function returns -1
Expand Down
Loading