Java OpenGL рендеринг многих треугольников - PullRequest
2 голосов
/ 29 ноября 2010

У меня есть приложение openGL (на самом деле JOGL, но здесь применимы те же понятия), где у меня есть сцена, которая визуализирует приблизительно 10 000 треугольников на каждом проходе рендеринга. Масштаб и угол треугольников должны быть рассчитаны для каждого рендеринга, поскольку треугольники должны оставаться с постоянным размером и вращением относительно местоположения камеры.

Я пытался использовать список отображения, а затем масштабировать / вращать перед каждым вызовом glCallList. Это работает, но приводит систему к ползанию. Я изучал использование буферов вершин для этого, но я не уверен, что это подходящий способ сделать это, поскольку мне нужно вращать / масштабировать при каждом рендеринге.

Может ли кто-нибудь помочь мне указать правильное направление для рендеринга такого количества треугольников в каждой сцене?

РЕДАКТИРОВАТЬ - Это обеспечивает некоторый дополнительный контекст для проблемы.

Приложение представляет собой картографическое приложение, отображающее трехмерное изображение мира. Существуют определенные формы, которые необходимо нарисовать на поверхности, указывающей в направлении относительно компаса, то есть под углом 30 градусов. Пользователь может вращать трехмерный вид, но формы должны оставаться плоскими на поверхности земли, а также указывать указанное направление.

спасибо, Джефф

Ответы [ 2 ]

5 голосов
/ 29 ноября 2010

Буферы вершин с GL_DYNAMIC_DRAW и Индексные буферы с GL_STATIC_DRAW - это лучшее, что вы можете сделать с точки зрения простоты.

Если у вас есть доступ к шейдерам (GLSL или HSL), используйте Vertex Buffers с GL_STATIC_DRAW и Indice Buffers с GL_STATIC_DRAW, и рассчитайте масштаб и вращение в вершинном шейдере. Таким образом, вы можете сбросить часть работы на графический процессор. (Если работа была загружена процессором для начала)

Может быть, делать выборку усеченного конуса перед рукой? Выброс окклюзии? Лучший способ ускорить работу приложения - уменьшить количество отображаемых треугольников.

Может быть, даже использовать некоторые потоки. Один поток для визуализации, другой для расчета масштаба и угла.

1 голос
/ 29 ноября 2010

10.000 треугольников - это на самом деле не так уж много, даже для вашего среднего ноутбука на сегодняшний день.

Списки отображения устарели, это не самый полезный подход.

Первое, что нужно сделать, это нарисовать свои треугольники за один вызов - это должно быть легко возможно.

Итак:

1) Храните все ваши данные треугольника (координаты вершины) в одном Buffer (именно так JOGL обрабатывает массивы вершин, IIRC). Тогда либо:

  • Обновлять этот буфер каждый кадр на ЦП и рендерить все это, используя glVertexPointer и glDrawArrays,
  • Создайте VBO и (GL_DYNAMIC_DRAW тип) и обновляйте его каждый кадр этим буфером. В этом случае более современный подход, но на самом деле не большая разница с вышеописанным с точки зрения скорости.

И после этого вы будете рендерить все эти 10.000 треугольников с помощью одного glDrawArrays вызова.

Это все равно оставит вычисление треугольников на ЦП, но сэкономит вам много времени ЦП, затрачиваемое на вызовы драйверов - все треугольники будут отправлены через ваш PCI-E одновременно и визуализированы в мгновение ока.

Если это все еще слишком медленно:

2) Подумайте, можете ли вы / хотите переместить некоторые операции, выполняемые над треугольниками, в графический процессор и выполнять вычисления в вершинном шейдере. Я не могу сказать здесь слишком много, пока не узнаю, какие вычисления вы делаете, но я действительно надеюсь, что 1) будет достаточно.

Если у вас было около 10.000 вызовов на CallList каждого кадра, это определенно является причиной вашей низкой производительности.

...