【问题标题】:Flood fill GLUT code not working洪水填充 GLUT 代码不起作用
【发布时间】:2014-03-28 18:40:18
【问题描述】:

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

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);
}

很遗憾,此代码不起作用。例如,我首先绘制了一个矩形并尝试填充该矩形。实际发生的情况是,从我单击填充的那一点开始,它右侧的像素开始填充一条线,最终靠近最右侧边缘的像素开始绘制。但这就是发生的一切。我不明白为什么。

【问题讨论】:

  • 为什么要将 RGB 值转换为 float?为什么不只检查零并完成它?
  • @CaptainObvlious 好的,所以我修改了代码以避免转换,但代码仍然不起作用。我觉得我的算法不正确,但当我查看代码时似乎并非如此。

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


【解决方案1】:

首先:不要这样做。完全在 CPU 上执行此操作将比在 GPU 上执行 2 次往返每个像素数量级

话虽如此,我仍然可以看到您的实施存在问题:您从不检查边界。 glReadPixels 只会返回 undefined 结果,如果您尝试读回位于帧缓冲区之外的像素,并且很可能全为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多