Я пишу алгоритм заполнения строки динамического сканирования в OpenGL C ++, и я сталкиваюсь с некоторыми проблемами при определении цвета пикселей, в результате чего мой код падает. Я использую GL_LINE_LOOP, чтобы сначала нарисовать контур фигуры, и glReadPixels (), чтобы прочитать значения пикселей.
Например, для приведенного ниже кода некоторые вершины выглядят неокрашенными, а некоторые точки, являющиеся соседями вершин, которые не должны быть частью контура, окрашены.
Это из-за линии OpenGLприближение или есть проблема в том, как я читаю пиксели с помощью glReadPixels ()?
vector<vector<int> > v;
void draw_outline() {
glBegin(GL_LINE_LOOP);
for (int i=0; i<v.size(); i++)
glVertex2i(v[i][0], v[i][1]);
glEnd();
glFlush();
}
void fill_color() {
unsigned char pixel[4];
vector<vector<int> > int_points;
vector<int> v1(2,0);
int x = 0, y = 0, isVertex = 0;
for (y=0; y<500; y++) {
int_points.clear();
for (x=0; x<500; x++) {
glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
if ((int)pixel[0] == 255) {
v1[0] = x - 250; v1[1] = y - 250;
cout << "X is " << v1[0] << " " << v1[1] << endl;
isVertex = 0;
for (int i=0; i<v.size(); i++) {
if (v[i][0] == v1[0] && v[i][1] == v1[1]) {
int next_point = (i + 1) % v.size();
int prev_point = (i - 1 + v.size()) % v.size();
if ((v[next_point][1] >= v[i][1] && v[prev_point][1] >= v[i][1]) || (v[next_point][1] <= v[i][1] && v[prev_point][1] <= v[i][1])){
int_points.push_back(v1);
int_points.push_back(v1);
}
else
int_points.push_back(v1);
isVertex = 1;
break;
}
}
if (!isVertex)
int_points.push_back(v1);
}
}
for (int i=0; i<int_points.size(); i = i + 2) {
int x1 = int_points[i][0], x2 = int_points[i+1][0];
for (int j=x1; j<=x2; j++) {
plot_point(j, int_points[i][1]);
}
}
}
}
void myDrawing() {
vector<int> p(2,0);
p[0] = 0; p[1] = 100;
v.push_back(p);
p[0] = 100; p[1] = 0;
v.push_back(p);
p[0] = 60; p[1] = -120;
v.push_back(p);
p[0] = -50; p[1] = -140;
v.push_back(p);
p[0] = -100; p[1] = 0;
v.push_back(p);
draw_outline();
fill_color();
unsigned char pixel[4];
}