Mengapa Warna Zum Kusam?
Dalam kod anda di bawah, anda meningkatkan max_iteration untuk mendapatkan lebih banyak warna. Walau bagaimanapun, pendekatan itu memberikan beberapa warna pada pembesaran 1x dan variasi yang lebih luas apabila dizum masuk. Ini berlaku kerana tiada warna sebenar dalam set Mandelbrot "sebenar", dan dengan meningkatkan lelaran_maks, anda hanya mendekati ideal itu.
Cara Mencapai Warna Cerah Sepanjang Proses Zum:
Untuk mencapai ini, anda perlu mengira lelaran titik pecahan, yang juga dikenali sebagai Mandelbrot Escape. Daripada membazirkan banyak warna secara seragam pada indeks yang tidak digunakan, anda mengedarkan warna kecerunan dengan lebih berkesan dengan menggunakan pendekatan histogram dan fungsi kecerunan khusus yang menarik secara visual.
Melaksanakan Lelaran Titik Terapung:
Untuk mengira lelaran titik terapung, anda boleh menggunakan yang berikut formula:
mu = m + frac = n + 1 - log(log|Z(n)| / log2)
Di manakah n ialah kiraan lelaran anda dan Z(n) ialah subhasil domain kompleks bagi persamaan yang anda sedang lelaran.
Menggunakan Fractional Escape kepada GLSL Mandelbrot Shader:
Kod yang disediakan menunjukkan GLSL Mandelbrot shader dengan pelarian pecahan dan pewarnaan semula berbilang warna:
Penekap Puncak:
<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>
Penerkap Serpihan:
<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>
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Warna-warna Bersemangat dalam Set Mandelbrot Sepanjang Zum?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!