Maison >Java >javaDidacticiel >Comment obtenir des couleurs vives dans un ensemble Mandelbrot tout au long de Zoom ?
Pourquoi les couleurs du zoom sont-elles ternes ?
Dans votre code ci-dessous, vous augmentez max_iteration pour obtenir plus de couleurs. Cependant, cette approche fournit peu de couleurs au grossissement 1x et une plus grande variété lors d'un zoom avant. Cela se produit parce qu'il n'y a pas de couleurs réelles dans le "vrai" ensemble de Mandelbrot, et en augmentant max_iteration, vous ne faites que vous rapprocher de cet idéal.
Comment obtenir des couleurs vives tout au long du processus de zoom :
Pour y parvenir, vous devez calculer des itérations de points fractionnaires, également connues sous le nom d'évasion de Mandelbrot. Au lieu de gaspiller uniformément de nombreuses couleurs sur des index inutilisés, vous répartissez la couleur du dégradé plus efficacement en utilisant une approche d'histogramme et une fonction de dégradé spécifique visuellement agréable.
Mise en œuvre d'itérations à virgule flottante :
Pour calculer les itérations à virgule flottante, vous pouvez utiliser la formule suivante :
mu = m + frac = n + 1 - log(log|Z(n)| / log2)
Où n est votre nombre d'itérations et Z(n) est le sous-résultat du domaine complexe de l'équation que vous êtes itération.
Application de l'échappement fractionnaire au shader GLSL Mandelbrot :
Le code fourni montre un shader GLSL Mandelbrot avec échappement fractionnaire et recoloration multicolore :
Vertex Shader :
<code class="glsl">// Vertex #version 420 core layout(location = 0) in vec2 pos; // glVertex2f <-1,+1> out smooth vec2 p; // texture end point <0,1> void main() { p = pos; gl_Position = vec4(pos, 0.0, 1.0); }</code>
Fragment Shader :
<code class="glsl">// Fragment #version 420 core uniform vec2 p0 = vec2(0.0, 0.0); // mouse position <-1,+1> uniform float zoom = 1.000; // zoom [-] uniform int n = 100; // iterations [-] uniform int sh = 7; // fixed point accuracy [bits] uniform int multipass = 0; // multi pass? in smooth vec2 p; out vec4 col; const int n0 = 1; // forced iterations after escape to improve precision vec3 spectral_color(float l) // RGB <0,1> <- lambda l <400,700> [nm] { float t; vec3 c = vec3(0.0, 0.0, 0.0); // Spectral color calculation based on wavelength if ((l >= 400.0) && (l < 410.0)) { t = (l - 400.0) / (410.0 - 400.0); c.r = +(0.33 * t) - (0.20 * t * t); } else if ((l >= 410.0) && (l < 475.0)) { t = (l - 410.0) / (475.0 - 410.0); c.r = 0.14 - (0.13 * t * t); } else if ((l >= 545.0) && (l < 595.0)) { t = (l - 545.0) / (595.0 - 545.0); c.r = +(1.98 * t) - (t * t); } else if ((l >= 595.0) && (l < 650.0)) { t = (l - 595.0) / (650.0 - 595.0); c.r = 0.98 + (0.06 * t) - (0.40 * t * t); } else if ((l >= 650.0) && (l < 700.0)) { t = (l - 650.0) / (700.0 - 650.0); c.r = 0.65 - (0.84 * t) + (0.20 * t * t); } if ((l >= 415.0) && (l < 475.0)) { t = (l - 415.0) / (475.0 - 415.0); c.g = +(0.80 * t * t); } else if ((l >= 475.0) && (l < 590.0)) { t = (l - 475.0) / (590.0 - 475.0); c.g = 0.8 + (0.76 * t) - (0.80 * t * t); } else if ((l >= 585.0) && (l < 639.0)) { t = (l - 585.0) / (639.0 - 585.0); c.g = 0.84 - (0.84 * t); } if ((l >= 400.0) && (l < 475.0)) { t = (l - 400.0) / (475.0 - 400.0);</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!