2013-07-29 2 views
3

Так что в настоящее время я делаю это, прежде чем загружать свои элементы в VBO. Я создаю новую матрицу и добавляю ее в нее. Я делаю это, поэтому я могу играть с матрицей столько, сколько хочу. Итак, я только что добавил положение камеры в координаты в матрице.OpenGL Shaders - Если трансляция камеры происходит на GPU или CPU?

Примечание: фактическое положение объектов сохраняется в другом месте, матрица представляет собой ступень трансляции.

Теперь это работает, но я не уверен, правильно ли это или если я должен перевести на местоположение камеры в шейдерах, а не в CPU.

Так вот мой вопрос:

Если перевод камеры произойдет на GPU или CPU?

+0

Вы говорите, что каждый кадр вы изменяете данные вершин? С помощью умножения матрицы? Где каждая вершина (для объекта) умножается на одну и ту же матрицу? * На процессоре *? –

+0

Каждый кадр Я создаю матрицу для каждого объекта, который я применяю для масштабирования, вращения и перевода на эту матрицу. – Gopgop

ответ

3

Я не совсем уверен, что вы сейчас делаете. Но разумный способ сделать это - не касаться VBO. Вместо этого передайте одну или несколько матриц преобразования в виде униформ в ваш вершинный шейдер и выполните умножение матрицы на графический процессор.

Изменение данных VBO на процессоре является безумным, это означает либо сохранение копии ваших данных вершин на процессоре, итерацию по нему, а также загрузку или отображение буфера и итерацию по нему. В любом случае, это было бы безумно медленным. Весь смысл иметь VBO, так что вы можете загружать свои данные вершин один раз и работать одновременно на CPU, в то время как GPU отключается и выполняет свою работу с указанными данными вершин.

Вместо этого вы просто храните свои вершины один раз в буфере вершин, желательно в пространстве объектов (только для здравого смысла). Затем вы отслеживаете матрицу преобразования для каждого объекта, которая преобразует вершины из пространства объекта в пространство клипа. Вы передаете эту матрицу в свой шейдер вершин и выполняете умножения для каждой вершины на графическом процессоре.

Очевидно, что графический процессор умножает каждую вершину по меньшей мере на одну матрицу на каждый кадр. Но у графического процессора есть параллельное оборудование, которое делает матричное умножение безумно быстрым. Поэтому, особенно когда ваши матрицы постоянно меняются (например, ваши объекты перемещаются), это намного быстрее, чем выполнение на процессоре и обновление массивного буфера. Кроме того, вы освобождаете свой процессор от других вещей, таких как физика или звук или что-то еще.

Теперь я могу себе представить, что вы не захотите НЕ делать этого, если ваш объект никогда не перемещается, однако умножение матрицы GPU, вероятно, примерно на той же скорости, что и умножение флота процессора (я не знаю специфики). Поэтому сомнительно, если для этого стоит большее количество шейдеров для статических объектов.

Резюме:

  • Обновление буферов на процессоре является SLOW.
  • Матричное умножение на GPU составляет FAST.
  • Нет обновлений для буфера обмена? = освободить процессор.
  • Умножения на графический процессор? = легко и быстро перемещать объекты (просто измените загружаемую матрицу).

Надеюсь, это немного помогло.

+0

Отличный ответ. Это также фиксировало еще одну проблему, с которой я столкнулся, все было увеличено: D Большое вам спасибо! – Gopgop

+0

«вы отслеживаете матрицу преобразования для каждого объекта», но это подразумевает потенциально много матричных операций на процессоре. Я пришел сюда, ища информацию о том, делать ли это на GPU (я попал в точку в коде GL ES 2, где основная матрица-умножитель на процессоре становится серьезной проблемой производительности, и я не ожидал, что это произойдет). – Adam

+0

Затем переместите их на GPU, например. загрузите матрицу камеры и матрицу вашего объекта в виде униформы и умножьте их на шейдер. Это добавляет больше умножения на GPU, но вычитает их из CPU. Вы можете перемещать матричные умножения практически в любом месте, даже загружать свои матрицы в потоковый буфер или аналогичный. Просто не умножайте каждую вершину на матрицу на CPU (это то, что мой ответ подчеркивает), но я предполагаю, что вы этого не делаете. – Invalid