洪水填充GLUT代码不起作用

时间:2014-03-28 18:40:18

标签: c++ opengl recursion glut flood-fill

我编写了以下用于洪水填充的代码,作为我正在开发的绘图程序的一部分:

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 个答案:

答案 0 :(得分:0)

首先:不要这样做。完全在CPU上完成数量级比向GPU 每像素进行2次往返更快。

话虽如此,我仍然可以看到您的实施问题:您永远不会检查边框。如果你试图读回位于帧缓冲区之外的像素,glReadPixels将只返回 undefined 结果,而且很可能全部为零。