@Tranzi

Как получить данные из буфера глубины при включенном multisample в OpenGL?

Я использую следудующий код для получения значения из буфера глубины в OpenGL,
glReadPixels(x, height - y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);

Чтобы потом рассчитать коордианты мыши в 3д пространстве. И все работает, пока я не включаю multisample сглаживание.
Я конечно могу найти луч и потом искать пересечения со всеми объектами на сцене и рассчитывать координату z уже из этого, но мне кажется это слишком ресурсозатратно , ведь я использую эту функцию при каждом движении мыши более чем на 10 пикселей, а работать данная программа должна и на старых слабых компьютерах.

Буду очень признателен если посоветуете как лучше разрешить эту проблему.
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
@MarkusD
все время мелю чепуху :)
Я конечно могу найти луч и потом искать пересечения со всеми объектами на сцене и рассчитывать координату z уже из этого, но мне кажется это слишком ресурсозатратно

Однократное использование glReadPixels в сотни раз более ресурсозатратнее обычного оптимизированного алгоритма проверки на пересечение луча с объектами сцены.

В разработке игр на мобильных устройствах алгоритм проверки пересечений запускается даже не на каждые 10 пикселей экрана, а просто постоянно в каждом кадре, пока игрок не поднимет палец с экрана. И у людей при этом проблем с производительностью нет даже на 96+ FPS.
В продуктовых решениях мы никогда не используем glReadPixels в покадровых рутинах. Ни в мобильной разработке, ни в десктопной, ни под консоли.

Вот ответ, который тебе поможет разобраться с переводом координат мышки в 3D пространство сцены.
Чтобы снизить трудоемкость проверки на пересечение с объектами сцены, используй или Q-Tree, или Oc-Tree, или BSP, или Агломерацию.
Чтобы снизить трудоемкость проверки на пересечение конкретного объекта, используй AABB, OOBB и все те же Q-Tree/Oc-Tree или BSP для отсечения лишних полигонов модели.

Это все позволит определять объект сцены под мышкой значительно быстрее чем всего один вызов glReadPixels с проходом по матрице пикселей.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы