2014-03-28 38 views
0

我寫了下面這段代碼洪水填充的畫圖程序我開發的一部分:洪水填充GLUT代碼不工作

void setPixel(int x, int y) 
{ 
    glColor4f(red, green, blue, alpha); 
    glBegin(GL_POINTS); 
    glVertex2f(x, y); 
    glEnd(); 
    glFlush(); 
} 
void floodFill(int x, int y) 
{ 
    unsigned char pick_col[3]; 
    float R, G, B; 
    glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pick_col); 
    R = (float) pick_col[0]/255.0; 
    G = (float) pick_col[1]/255.0; 
    B = (float) pick_col[2]/255.0; 

    //std::cout<<R<<" "<<G<<" "<<B<<"\n"; 

    if(R!=0.0 || G!=0.0 || B!=0.0) //true for any non-black colour (BTW, my canvas is black) 
    return; 

    setPixel(x,y); 

    floodFill(x+1,y); 
    floodFill(x,y+1); 
    floodFill(x,y-1); 
    floodFill(x-1,y); 
} 

不幸的是,這個代碼是行不通的。例如,我首先畫了一個矩形並試圖填充矩形。實際發生的事情是,從我點擊填充的位置開始,右邊的像素開始被填滿,最終右邊緣附近的像素開始被繪製。但這就是發生的一切。我不明白爲什麼。

+1

你爲什麼要將RGB值轉換爲float?爲什麼不只是檢查零點並完成它呢? –

+0

@CaptainObvlious好吧,所以我修改了代碼以避免轉換,但代碼仍然不起作用。我感覺我的算法是不正確的,但當我看代碼時看起來並不是這樣。 – Ricky

回答

0

首先:不要這樣做。完全在CPU上執行的速度將是,其數量級爲,比每個像素對GPU 執行2次往返的速度要快。

話雖如此,我仍然可以看到你的實現的問題:你永遠不會檢查邊界。 glReadPixels只會返回undefined如果您嘗試讀取位於幀緩衝區之外的像素,並且很可能全部爲零,則會返回結果。