Рисование каждого пикселя в буферный буфер или текстуру для отображения на экране с использованием opengl - без glDrawPixels () - PullRequest
1 голос
/ 19 мая 2011

По сути, у меня есть массив данных (данные симуляции флюида), которые генерируются по кадрам в режиме реального времени из пользовательского ввода (запускается в оперативной памяти системы).Я хочу записать плотность жидкости в текстуру в виде альфа-значения - я интерполирую значения массива, чтобы получить массив размером с экран (сетка относительно мала) и сопоставить его с диапазоном 0 - 255.Каков наиболее эффективный способ (функция ogl) записать эти значения в текстуру для использования?

Вещи, которые были предложены в другом месте, которые я не думаю, что хочу использовать (пожалуйста, дайте мне знать, еслиЯ ошибаюсь):

  1. glDrawPixels () - у меня сложилось впечатление, что это будет вызывать прерывание каждый раз, когда я вызываю его, что замедляет его, особенно ввысокое разрешение.

  2. Использование шейдера - я не думаю, что шейдер может принимать и обрабатывать объем данных в массиве каждого кадраобъем данных, которые они могут принять, слишком мал)

Ответы [ 3 ]

2 голосов
/ 19 мая 2011

С чего вы взяли, что шейдер будет работать плохо?Вся идея шейдеров заключается в очень, очень быстрой обработке огромных объемов данных.Пожалуйста, используйте Google по поисковой фразе «GPU-вычисления общего назначения» или «GPGPU».

Шейдеры могут собирать данные только из буферов, а не разбрасывать.Но они могут изменять значения в буферах.Это позволяет (фрагментному) шейдеру записывать местоположения * GL_POINT * s, которые затем в свою очередь помещаются в целевые пиксели текстуры.Шейдерная модель 3 и более поздние графические процессоры также могут получать доступ к сэмплерам текстур на этапах геометрии и вершинного шейдера, поэтому часть фрагментного шейдера становится действительно простой.

Если у вас просто линейный поток позиций и значений, просто отправьте теоткрыть OpenGL через массив вершин, рисуя * GL_POINT * s, а вашей целевой текстурой является цветное вложение для объекта кадрового буфера.

2 голосов
/ 19 мая 2011

Если я правильно понимаю вашу проблему, оба решения слишком усложняют проблему. Правильно ли я считаю, что вы уже сгенерировали массив размером x * y, где x и y - ваше разрешение экрана, заполненное байтами без знака?

Если это так, если вам нужна текстура OpenGL, которая использует эти данные в качестве своего альфа-канала, почему бы просто не создать текстуру, связать ее с GL_TEXTURE_2D и вызвать glTexImage2D со своими данными, используя GL_ALPHA в качестве формата и внутренний формат, GL_UNSIGNED_BYTE как тип и (x, y) как размер?

0 голосов
/ 13 августа 2016

Каков наиболее эффективный способ (функция ogl) записать эти значения в текстуру для использования?

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

, посколькувы хотите обновить эти данные для каждого кадра, вы также хотите искать эффективную буферную потоковую объектную , чтобы не вызывать неявную синхронизацию между CPU и GPU.Простой способ сделать это в вашем сценарии - использовать кольцевой буфер из 3 PBO, который вы продвигаете каждый кадр.

Вещи, которые были предложены в другом месте, что я не думаю, что хочуиспользуйте (пожалуйста, дайте мне знать, если я ошибаюсь):

  1. glDrawPixels () - у меня сложилось впечатление, что это будет вызывать прерывание каждый раз, когда я его вызываю, чтоон медленный, особенно при высоких разрешениях.

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

Но не использовать glDrawPixels - все еще хороший выбор.Это не очень эффективно, и оно устарело и удалено из современного GL.

Используйте шейдер - я не думаю, что шейдер может принимать и обрабатывать объем данных в массиве каждого кадра (в других местах упоминалось, что ограничение на объем данных, которые они могут принимать, слишком мало)

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

...