Переключатель цвета с использованием OpenGL - PullRequest
0 голосов
/ 16 декабря 2018

Color Switch

Я пытался сделать игру смены цвета, используя OpenGL.

Я застрял в использовании метода glReadPixels();, где я хочу сравнить цветот сферы к вращающемуся диску непосредственно перед тем, как сфера касается диска.

PLZ, наведите меня, я нахожу трудности в поиске точного положения, в котором я хочу прочитать пиксельный цвет

вот как я пытался это сделать.

unsigned char pixel[4];
glReadPixels(0, sphere_y+1, 1, 1,GL_RGB,GL_UNSIGNED_BYTE,pixel);

cout << "R = " << ((float)pixel[0])/(float)256;
cout << "G = " << ((float)pixel[1])/ (float)256;
cout << "B = " << ((float)pixel[2])/ (float)256;
cout << "A = " << ((float)pixel[3])/ (float)256;

, где

glOrtho(-10,10,-10,10,-10,10);

1 Ответ

0 голосов
/ 16 декабря 2018

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...