확대/축소 색상이 왜 흐릿합니까?
아래 코드에서는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!