2013-10-13 45 views
1

我试图从使用glReadPixels的像素获取数据。它工作了一段时间。但现在它停止工作,我不知道为什么。glReadPixels不起作用

我需要制作Flood fill算法。

glBegin(GL_POINTS); 

    float target[3] = { 1.0, 1.0, 0.0 }; // target color 
    float border[3] = { 1.0, 1.0, 1.0 }; // border color 
    float clearp[3] = { 0.0, 0.0, 0.0 }; // clear color 
    std::stack<pixel*> colored; // stack with pixels 
    if (!stack.empty()) // stack contains first pixel 
     colored.push(stack.top()); 

    while(!colored.empty()) { 

     pixel *p = colored.top(); 
     glRasterPos2i(p->x, p->y); 
     glDrawPixels(1, 1, GL_RGB, GL_FLOAT, target); 
     colored.pop(); 

     //up 
     float pix[3]; 
     glReadPixels(p->x, p->y + 1, 1, 1, GL_RGB, GL_FLOAT, pix); 
     if (!compare(pix,border) && compare(pix,clearp)) { 
      pixel *pn = new pixel(); 
      pn->x = p->x; 
      pn->y = p->y + 1; 
      colored.push(pn); 
     } 
     //down 
     glReadPixels(p->x, p->y - 1, 1, 1, GL_RGB, GL_FLOAT, pix); 
     if (!compare(pix,border) && compare(pix,clearp)) { 
      pixel *pn = new pixel(); 
      pn->x = p->x; 
      pn->y = p->y - 1; 
      colored.push(pn); 
     } 

     //left 
     glReadPixels(p->x - 1, p->y, 1, 1, GL_RGB, GL_FLOAT, pix); 
     if (!compare(pix,border) && compare(pix,clearp)) { 
      pixel *pn = new pixel(); 
      pn->x = p->x - 1; 
      pn->y = p->y; 
      colored.push(pn); 
     } 

     //right 
     glReadPixels(p->x + 1, p->y, 1, 1, GL_RGB, GL_FLOAT, pix); 
     if (!compare(pix,border) && compare(pix,clearp)) { 
      pixel *pn = new pixel(); 
      pn->x = p->x + 1; 
      pn->y = p->y; 
      colored.push(pn); 
     } 

    } 
glEnd(); 

但是数组pix不包含RGB颜色数据。它通常是这样的-1.0737418e+008

问题在哪里?它应该工作正常...

+0

'glGetError()'是否返回GL_NO_ERROR'(0)以外的任何东西?另外:'glBegin(GL_POINTS)'和相应的'glEnd()'在这里没用,因为你没有绘制任何点 - 你正在绘制像素,并且使用glReadPixels/glDrawPixels非常慢(通过加速图形标准)。 – user2802841

+1

请问有人可以停止使用OpenGL glReadPixels/glDrawPixels实现洪水填充吗?这是操纵一些帧缓冲器像素的最低效方式。只是不要这样做。 – datenwolf

+1

另一种获取和设置像素颜色的方法? – lapots

回答

5

这是一个错误,称为除了glBeginglEnd之间的功能非常有限的一套。该列表主要由与指定顶点属性相关的功能组成(例如,glVertex,glNormal,glColor,glTexCoord等)。因此,如果您的OpenGL实现遵循OpenGL规范,则glReadPixels应该立即返回而不执行,因为在glBegin/glEnd组内被调用。从您的通话周围删除,glReadPixels应按预期工作。