>  기사  >  Java  >  Zoom 전체에서 Mandelbrot 세트에서 생생한 색상을 얻는 방법은 무엇입니까?

Zoom 전체에서 Mandelbrot 세트에서 생생한 색상을 얻는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-03 16:58:30358검색

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

확대/축소 색상이 왜 흐릿합니까?

아래 코드에서는 max_iteration을 늘려 더 많은 색상을 얻습니다. 그러나 이 접근 방식은 1배 확대 시에는 몇 가지 색상을 제공하고 확대하면 더 다양한 색상을 제공합니다. 이는 "진정한" Mandelbrot 세트에 실제 색상이 없고 max_iteration을 늘리면 이상적인 색상에 더 가까워지기 때문에 발생합니다.

확대/축소 프로세스 전반에 걸쳐 생생한 색상을 얻는 방법:

이를 달성하려면 분수점을 계산해야 합니다. Mandelbrot Escape라고도 알려진 반복입니다. 사용되지 않는 인덱스에 많은 색상을 균일하게 낭비하는 대신 히스토그램 접근 방식과 시각적으로 만족스러운 특정 그라데이션 기능을 사용하여 그라데이션 색상을 보다 효과적으로 배포합니다.

부동 소수점 반복 구현:

부동 소수점 반복을 계산하려면 다음을 사용할 수 있습니다. 공식:

mu = m + frac = n + 1 - log(log|Z(n)| / log2)

여기서 n은 반복 횟수이고 Z(n)은 반복 중인 방정식의 복소 영역 하위 결과입니다.

분수 이스케이프 적용 GLSL Mandelbrot Shader:

제공된 코드는 GLSL을 보여줍니다. 분수 이스케이프 및 다색 다시 칠하기 기능이 있는 만델브로 셰이더:

정점 셰이더:

<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>

위 내용은 Zoom 전체에서 Mandelbrot 세트에서 생생한 색상을 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.