为什么缩放颜色暗淡?
在下面的代码中,您增加 max_iteration 以获得更多颜色。然而,这种方法在 1 倍放大倍率下提供的颜色很少,而在放大时提供的颜色种类更多。发生这种情况是因为“真实”Mandelbrot 集中没有实际颜色,并且通过增加 max_iteration,您只会更接近理想值。
如何在整个缩放过程中实现鲜艳的色彩:
要实现这一点,您需要计算小数点迭代,这也称为曼德尔布罗特逃逸。您不必在未使用的索引上统一浪费许多颜色,而是通过采用直方图方法和特定的视觉上令人愉悦的渐变函数来更有效地分配渐变的颜色。
实现浮点迭代:
要计算浮点迭代,您可以使用以下公式:
mu = m + frac = n + 1 - log(log|Z(n)| / log2)
其中 n 是您的迭代计数,Z(n) 是您所计算的方程的复数域子结果迭代。
将分数转义应用于 GLSL Mandelbrot 着色器:
提供的代码演示了具有分数转义和多色重新着色的 GLSL Mandelbrot 着色器:
顶点着色器:
<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>
片段着色器:
<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>
以上是如何在整个变焦过程中在 Mandelbrot 集中实现鲜艳的色彩?的详细内容。更多信息请关注PHP中文网其他相关文章!