Перемещение вершины полигона мышью (OpenGL)
Какой самый оптимальный способ реализовать перемещение вершины полигона мышкой?
Первое, что приходит в голову - сравнивать положение курсора с каждой точкой в массиве вершин (+ некоторое смещение по координатам, чтобы расширить область попадания в вершину).
Будет ли этот вариант оптимальным? Ведь каждый кадр необходимо будет пробежать по всему массиву, который может иметь очень большой размер (меш какой-либо фигуры, например).
Ответы (1 шт):
В свое время я делал это так - первая отрисовка как обычно на экран, а потом ещё одна в отдельный буфер. Но не просто отрисовка, а особая. Все интересующие точки рисуются разными цветами и так, что бы соответствие цвет-номер(id) точки было однозначным. То, что не интересно, даже не рисуется. И теперь задача решается элементарно - по координатам получаем цвет, а цвет однозначно конвертируем в индекс массива или какой то внутренний id. В моем случае было легко - у меня была 2д картинка и я рисовал второе на обычной bitmap.
В случае OpenGl можно воспользоваться функцией glReadPixels, которая как раз позволяет прочитать пиксель по координатам.
То есть, в цикле отрисовки Вам нужно создать ещё один буфер, и там ещё раз нарисовать то же самое (с определенными упрощениями конечно) и готово. Этот буфер (и код отрисовки удобен тем, что можно нарисовать это прям по верху картинки и сравнить.
Также, не стоит забывать, что если на экране рисуем 4к картинку, то эта вспомогательная картинка может вполне быть в 16 раз меньше.
Информацию к размышлению можно почерпнуть в этом туториале - https://learnopengl.com/Advanced-Lighting/Bloom (да, там о блум-эффекте, но суть такая же).