1-й и 2-й параметр glReadPixels
- это координаты окна фрагмента в буфере чтения, но не нормализованные координаты устройства или даже координаты мира или модели.
У вас естьдля вычисления координат окна круга.
Предполагая, что вы знаете координаты x и y точки в мировом пространстве.Координата мирового пространства - это координата точки, преобразованная матрицей вида модели:
float test_x = .....; // world x coordinate
float test_y = .....; // world y coordinate
Поскольку проекция (glOrtho(-10,10,-10,10,-10,10)
) известна, можно рассчитать нормализованные координаты устройства:
float ndc_x = test_x / 10.0f; // [-10.0, 10.0] -> [-1.0, 1.0]
float ndc_y = test_y / 10.0f; // [-10.0, 10.0] -> [-1.0, 1.0]
Чтобы преобразовать это в координаты окна, ширина и высота буфера кадра должны быть известны:
float width = .....; // window width
float height = .....; // window height
float window_x = width * (0.5 + 0.5 * ndc_x); // [-1.0, 1.0] -> [0.0, width]
float window_y = height * (0.5 + 0.5 * ndc_y); // [-1.0, 1.0] -> [0.0, height]
unsigned char pixel[4];
glReadPixels(window_x, window_y, 1, 1,GL_RGB,GL_UNSIGNED_BYTE, pixel);
Поскольку вы используете glOrtho
, я предполагаючто вы используете устаревший конвейер фиксированных функций OpenGL.
Прочтите о конвейере фиксированных функций и посмотрите Спецификация вершин и Shader для современного уровнярендеринг.
gluProject
- удобная функция для прямого преобразования координат модели в координаты окна:
float object_x = .....; // object x coordinate
float object_y = .....; // object y coordinate
GLdouble model[16];
glGetDoublev(GL_MODELVIEW_MATRIX, model);
GLdouble proj[16];
glGetDoublev(GL_PROJECTION_MATRIX, proj);
GLint view[4];
glGetIntegerv(GL_VIEWPORT, view);
GLdouble wnd_x, wnd_y, wnd_z;
gluProject(object_x, object_y, 0.0, model, proj, view, &wnd_x, &wnd_x, &wnd_z);
unsigned char pixel[4];
glReadPixels(wnd_x, wnd_y, 1, 1,GL_RGB,GL_UNSIGNED_BYTE, pixel);