2013-06-13 5 views
0

Я пытаюсь реализовать систему сохранения состояний, сохраненную на iPhone, с использованием OpenGL ES 2.0. Сохраняя состояние, я имею в виду, что каждая частица интегрируется вперед во времени, имея уникальный вектор скорости и положения, который изменяется со временем и не может быть вычислен из начальных условий при каждом вызове рендеринга.Система сохранения состояний для OpenGL ES 2.0

Вот один из возможных способов, о котором я могу думать.

  1. Настройка начальных условий частиц в VBO.
  2. Интеграция частиц в вершинном шейдере, запись результата в текстуру в фрагментном шейдере. (1-й вызов рендеринга)
  3. Скопируйте данные из текстуры в VBO.
  4. Извлечь частицы из данных в VBO. (Второй вызов рендера)
  5. Повторите 2.-4.

Единственное, что я не умею делать эффективно, - это шаг 3. Должен ли я пройти через процессор? Интересно, возможно ли это сделать на GPU с OpenGL ES 2.0. Любые советы приветствуются!

+0

Какие данные хранятся на шаге 2 и какие типы данных вы ожидаете передать на шаге 3? – Kimi

+0

Для простоты, скажем, 4 числа с плавающей запятой на вершину. Я бы записал их в значения rgba текстуры в шейдере фрагмента (один пиксель на частицу/вершину/фрагмент). – hanno

ответ

2

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

Я думаю, что ваш единственный вариант, если вам нужно использовать графический процессор, - использовать glReadPixels для копирования содержимого фреймбуфера после рендеринга. Вероятно, вы также захотите проверить и использовать EXT_color_buffer_float или связать, если они доступны, чтобы убедиться, что у вас высокие значения точности (RGBA8, вероятно, не будет достаточным для ваших частиц). Если вы смешиваете это с обычным рендерингом, вы, вероятно, захотите создать кучу буферизации (подождите один или два кадра), чтобы вы не остановили процессор, ожидающий GPU (это было бы особенно неприятно для PowerVR, так как оно буферизует весь кадр перед рендерингом).

ES3.0 будет поддерживать преобразование обратной связи, что не помогает, но, надеюсь, дает вам некоторую надежду на будущее.

Кроме того, если вы работаете на процессоре ARM, похоже, было бы быстрее использовать NEON для быстрого обновления всех ваших частиц. Это может быть довольно быстро и пропустить все накладные расходы, которые вы понесете из метода CPU + GPU.

+0

Спасибо. Это в значительной степени то, что я подозревал. Жаль... – hanno

 Смежные вопросы

  • Нет связанных вопросов^_^