这是一个简单的程序,试图实现边界填充算法。作为一个例子,它会尝试用蓝色填充绿色矩形,并保持其他所有内容不变。简单的Opengl程序不工作,因为它应该是
这个程序有什么问题?
这是应用该算法之前的图片: 这是算法应用时的图片。正如你可以清楚地看到算法/应用程序停留在一个地方!
这是源代码:
#include <iostream>
#include <glut.h>
using namespace std;
bool b = false;
void init(void)
{
glClearColor(1.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,1366.0,0.0,768.0);
}
bool getpixelcolor(GLint x, GLint y)
{
unsigned char pick_col[3];
float r,g,b;
glReadPixels(x , y , 1 , 1 , GL_RGB , GL_UNSIGNED_BYTE , pick_col);
r = pick_col[0]/255.0;
g = pick_col[1]/255.0;
b = pick_col[2]/255.0;
//cout<<"b:"<<b<<"\r\n";
if ((r != 1)&&(b != 1)&&(g == 1))//g==1
{
return true;
}
else
{
return false;
}
}
void PutPoint(int x, int y)
{
glBegin (GL_POINTS);
glColor3f (1.0,1.0,1.0);
glVertex2i (x,y);
glEnd();
glFlush();
glPointSize(1);
glBegin (GL_POINTS);
glColor3f (0.0,0.0,1.0);
glVertex2i (x,y);
glEnd();
glFlush();
}
void Filling(int x,int y)
{
bool Value = getpixelcolor(x,y);
if (Value==true)
{
PutPoint(x, y);
Filling (x+1,y);
Filling (x-1,y);
Filling (x,y+1);
Filling (x,y-1);
}
}
void displayfnc()
{
if (b==false)
{
glClear(GL_COLOR_BUFFER_BIT);
b=true;
glColor3f(0.0,1.0,0.0);
glRecti(100,100,200,200);
glFlush();
Filling(180,180);
}
}
void Timer(int extra)
{
glutPostRedisplay();
glutTimerFunc(30,Timer,0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(1366,768);
glutInitWindowPosition(0, 0);
glutCreateWindow("BoundaryFill");
init();
glutDisplayFunc(displayfnc);
glutTimerFunc(10,Timer,0);
glutMainLoop();
return 0;
}
非常感谢你,但我应该怎么做,如果我不打算使用上述语句在OpenGL,诚实我不知道你通过在内存中使用cpu进行洪水填充来告诉我什么,然后上传到opengl纹理中!对不起,我是opengl上的noob。 – Breeze 2013-04-07 15:17:12
和我的大问题是,当我阅读像素是绿色的..它显示我的像素是绿色的,当我用蓝色绘制该像素并再次阅读时,我didnet说它的像素是蓝色的...我想知道为什么它剂量显示第二个像素绘图(背景颜色为红色,第一个颜色为绿色,第二个为蓝色) – Breeze 2013-04-07 15:54:17
@Hossein:将整个图片读入一个大缓冲区(即宽度和高度> 1的glReadPixels),然后执行所有像素操作那个缓冲区。另外OpenGL并不意味着被用作像素操作API;这样做效率非常低。 – datenwolf 2013-04-07 16:45:19