問題:
使用最大迭代次數為Mandelbrot 集著色的標準方法導致縮小時顏色缺乏,放大時顏色過飽和。挑戰在於創建一種著色方案,在不同的縮放等級下保持多種顏色。
解:
1。基於直方圖的顏色映射:
2.小數迭代計數(Mandelbrot 轉義):
其他增強功能:
範例實作:
// Vertex Shader layout(location = 0) in vec2 pos; out vec2 p; void main() { p = pos; gl_Position = vec4(pos, 0.0, 1.0); } // Fragment Shader uniform vec2 p0; uniform float zoom; uniform int n; uniform int sh; uniform int multipass; in vec2 p; out vec4 col; // Compute fractional iteration count float mu = m + frac = n + 1 - log(log(sqrt(xx + yy)) / log(2.0)); mu *= float(1 << sh); int i = int(mu); // Multi-pass coloring if (multipass != 0) { // Quantize color based on iterations float r = (i >> 0) & 255; r /= 255.0; float g = (i >> 8) & 255; g /= 255.0; float b = (i >> 16) & 255; b /= 255.0; col = vec4(r, g, b, 255); } // Visible spectrum color gradient else { float q = float(i) / float(N); q = pow(q, 0.2); col = vec4(spectral_color(400.0 + (300.0 * q)), 1.0); }
結果:
這種方法結合了基於直方圖的著色、分數迭代計數和多遍重新著色,以實現生動且色彩豐富的表示Mandelbrot 設定在所有縮放等級。
以上是如何在不同縮放等級的 Mandelbrot 集中保持色彩鮮豔度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!