У меня есть код для алгоритма flood fill
.Алгоритм заполнения наводнений работает медленно
void floodFill() {
float target[3] = { 1.0, 1.0, 0.0 };
float border[3] = { 1.0, 1.0, 1.0 };
float clearp[3] = { 0.0, 0.0, 0.0 };
std::stack<pixel*> colored;
if (!stack.empty()) // stack contains first pixel
colored.push(stack.top());
while(!colored.empty()) {
pixel *p = colored.top();
drawPixel(p->x, p->y, target);
colored.pop();
//up
float pix[3];
glReadPixels(p->x, p->y + KOEF, 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 + KOEF;
colored.push(pn);
}
//down
glReadPixels(p->x, p->y - KOEF, 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 - KOEF;
colored.push(pn);
}
//left
glReadPixels(p->x - KOEF, p->y, 1, 1, GL_RGB, GL_FLOAT, pix);
if (!compare(pix,border) && compare(pix,clearp)) {
pixel *pn = new pixel();
pn->x = p->x - KOEF;
pn->y = p->y;
colored.push(pn);
}
//right
glReadPixels(p->x + KOEF, p->y, 1, 1, GL_RGB, GL_FLOAT, pix);
if (!compare(pix,border) && compare(pix,clearp)) {
pixel *pn = new pixel();
pn->x = p->x + KOEF;
pn->y = p->y;
colored.push(pn);
}
}
}
Обращаю пиксель, используя этот метод
void drawPixel(float x, float y, float *t) {
glRasterPos2i(x, y);
glDrawPixels(1, 1, GL_RGB, GL_FLOAT, t);
for(int i = 0; i < KOEF; i++) {
glRasterPos2i(x, y + i);
glDrawPixels(1, 1, GL_RGB, GL_FLOAT, t);
glRasterPos2i(x + i, y);
glDrawPixels(1, 1, GL_RGB, GL_FLOAT, t);
glRasterPos2i(x + i, y + i);
glDrawPixels(1, 1, GL_RGB, GL_FLOAT, t);
}
};
Чтобы заполнить некоторую область Я выбираю первый пиксель мыши, а затем вызвать метод floodFill
.
void mouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
pixel *p = new pixel();
p->x = x;
p->y = HEIGHT - y;
if (!stack.empty())
stack.pop();
stack.push(p); // first pixel
floodFill();
}
};
В результате (к примеру)
Но он работает очень медленно (несколько секунд область на картинке -.. Он рисовал его в течение 11 секунд область вокруг буквы - 43 секунд). И я думал, что он медленно рисует пиксель после пикселя, но он ждет несколько секунд, а затем я вижу результат.
мой компьютер
intel core 2 duo p8600 2.4 GHz
nvidia 9600m gt 512 mb
windows x86
ram 4 GB(3)`
Если это работает так медленно или есть проблемы?
Вы пытались запустить свою программу под профилировщиком, например [Very Sleepy] (http://www.codersnotes.com/sleepy)? –
Не удивительно, что 'glReadPixels (...)' - это операция с обратным проходом, и вы буквально заливаете OpenGL однопиксельными чтениями. OpenGL основан на архитектуре клиент/сервер, вам нужно минимизировать количество обратных ссылок, если вы хотите достойную производительность. Вам лучше было бы сделать это полностью на процессоре, а затем перенести свое изображение на OpenGL в самом конце или, по крайней мере, на чтение более одного пикселя за раз. –
Если вы хотите, чтобы пиксели рисовались один за другим, вы должны поменять буферы внутри вашего 'while' –