首頁 > Java > java教程 > 如何在整個變焦過程中在 Mandelbrot 集中實現鮮豔的色彩?

如何在整個變焦過程中在 Mandelbrot 集中實現鮮豔的色彩?

Susan Sarandon
發布: 2024-11-03 16:58:30
原創
385 人瀏覽過

How to Achieve Vibrant Colors in a Mandelbrot Set Throughout Zoom?

為什麼縮放顏色會變暗?

在下面的程式碼中,您增加 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板