2014-04-19 22 views
1

,我有以下Mandelbrot集用C++編寫代碼與OpenGL的使用,但顏色是不正確的,這是希望的顏色: enter image description here壞着色設置與C++和OpenGL的

,但我得到這個: enter image description here

int vala = 600; 
int valb = 600; 
//render one frame 
void Application::render(void) 
{ 
    // Clear the window and the depth buffer 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    //render grid 

    Image img(vala, valb); 
    double MinRe = -2.0; 
    double MaxRe = 1.0; 
    double MinIm = -1.2; 
    double MaxIm = MinIm+(MaxRe-MinRe)*vala/valb; 
    double Re_factor = (MaxRe-MinRe)/(vala-1); 
    double Im_factor = (MaxIm-MinIm)/(valb-1); 
    unsigned MaxIterations = 250; 
    for(unsigned int y = 0; y < img.height; y++){ 
     double c_im = MaxIm - y*Im_factor; 
     for(unsigned x=0; x< img.width; ++x){ 
      double c_re = MinRe + x*Re_factor; 
      double Z_re = c_re, Z_im = c_im; 
      bool isInside = true; 
      for(unsigned n=0; n<MaxIterations; ++n){ 

       double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im; 
       if(Z_re2 + Z_im2 > 4) 
       { 
        isInside = false; 
        break; 
       } 

       Z_im = 2*Z_re*Z_im + c_im; 
       Z_re = Z_re2 - Z_im2 + c_re; 


       double z = sqrt(Z_re*Z_re + Z_im*Z_im); 
       int brightness = 256. *log(1.75 + n - log(log(z))); 
       img.setPixel(x,y, Color(sin(time)*brightness, sin(time/2)*brightness, brightness)); 



      } 


      } 

     } 


    img.scale(this->window_width, this->window_height); 

    renderImage(&img); 

    //swap between front buffer and back buffer 
    SDL_GL_SwapWindow(this->window); 
} 

任何人都知道爲什麼會發生這種情況,以及如何解決它?

非常感謝。

+1

除了'glClear(...)'這裏沒有一點GL代碼。我懷疑'Image'或'renderImage(...)'的實現是責任,但它們都沒有顯示出來。如果您直接輸出到圖像文件而不是GL,它會改變什麼嗎? –

+0

@ AndonM.Coleman它可能沒有太多的openGL代碼,但程序的其餘部分確實包含許多行代碼,所以程序本身必須支持100%的OpenGL。 Image和renderImage不是問題,我保證它。問題來自方程打印顏色... – Gera

+0

哦,我明白了。我解釋了這個問題,好像上面的圖片也是使用這段代碼生成的,並且錯誤的圖片是試圖在GL中顯示它的結果。 –

回答

0

您正在設置循環內的顏色,這與我所看到的任何Mandelbrot代碼都不相同。它也多次爲相同的像素設置顏色,這是非常低效的。邏輯問題的另一個方面是你設置了isInside,但是從未使用它。

通常這樣做的方式是在循環終止後設置顏色。如果isInside爲真,則將顏色設置爲黑色(如果圖像被清除爲黑色,則保持不變)。否則,你設置顏色。如果您查看origin of the code you use,他們建議根據迭代次數確定「外部」案例中的顏色,在您的案例中將爲n。您發佈的代碼使用Z_re/Z_im的值來確定顏色。

編輯:好的,你的公式同時使用nZ_re/Z_im。在任何情況下,除非您確切知道參考圖像使用了什麼論壇,並且您也使用相同的參考圖像,否則您不能指望完全相同的顏色。如果你解決了我上面指出的問題,那麼你至少應該在裏面弄黑。