Как я могу использовать графический конвейер для визуализации объемных данных на основе функции плотности?

12

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

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

Итак, есть ли способ, которым мы можем изменить графический конвейер таким образом, чтобы функциональные возможности каждого этапа с данными и тип данных, выводимых на каждом этапе, менялись в моих интересах? Если нет, то есть ли способ, с помощью которого я могу использовать «сырые» функции API для создания собственного конвейера? Если нет, то, пожалуйста, укажите, почему это невозможно.

РЕДАКТИРОВАТЬ : Мое приложение использует функции плотности для представления геометрии. Функция имеет значение в каждой точке пространства. Я делю усечку камеры на 3-ю сетку, каждый блок может быть спроецирован как пиксель. В каждом блоке я интегрирую функцию плотности и проверяю, превышает ли ее значение требуемое значение. Если да, то предполагается, что что-то существует в этом блоке и что пиксель, соответствующий этому блоку, визуализируется. Итак, теперь в моем рендерере я хочу передать функцию (которую я представляю строкой) графическому оборудованию вместо данных вершин в буферах вершин. это также подразумевает, что у вершинного шейдера не будет вершин для преобразования в однородное пространство клипа, а фрагментный шейдер не получит информацию о пикселях. вместо этого, теперь большая часть поиска и оценки происходит на пиксель.

Легкая искра
источник
Является ли «функция плотности функции» тавтологией?
Pharap
@Pharap, это была опечатка. это просто «функция божественности», которая представляет присутствие «материи» в пространстве.
Легкая искра
2
Похоже, вы просто хотите создать изоповерхность, которая является хорошо изученной проблемой. Вы видели http.developer.nvidia.com/GPUGems3/gpugems3_ch07.html или искали в метаболах, визуализации облаков точек, извлечении изоповерхностей или объемном рендеринге? Кроме того, какая производительность вам требуется, это будет иметь огромное значение при выборе техники, которую вы ищете, в сочетании со сложностью ваших расчетов. Я думаю, что вы также обнаружите, что на пиксель будет мерцать, когда камера движется, и потребуется субпиксель.
Патрик Хьюз

Ответы:

18

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

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

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

Метод полноэкранного треугольника очень распространен в графике в реальном времени для операций постобработки, поэтому вы, вероятно, сможете найти всю необходимую вам информацию, немного погуглив.

Кстати, вас может заинтересовать чтение « Рендеринга миров с двумя треугольниками » Иниго Куилеса, доклад, в котором описано, как визуализировать трехмерные сцены, созданные с использованием математических функций (в частности, полей расстояния), с использованием техники полноэкранного пиксельного шейдера.

Натан Рид
источник
Так принимает ли пиксельный шейдер произвольные входные данные (например, строки или другие типы пользовательских объектов), чтобы я мог передавать свои функции?
Легкая Искра
Я сомневаюсь, что вы захотите попробовать запустить синтаксический анализатор и / или язык для произвольных строк функций на графическом процессоре, что было бы неудобно, поскольку графические процессоры на самом деле не имеют общего назначения. Скорее всего, вы захотите динамически создать сам шейдер в своем основном коде, а затем позволить графической системе скомпилировать и запустить полученный шейдер.
Патрик Хьюз
@TheLightSpark Правильно, вы бы не передавали строки в шейдер (у языков шейдинга нет даже строкового типа), вам нужно было бы генерировать и компилировать код шейдера для нужных вам функций. Это может быть сделано во время выполнения при необходимости.
Натан Рид
Начав читать ваш ответ, я представил себе монитор в форме треугольника;) Есть ли преимущество в том, чтобы использовать только один треугольник вместо двух, которые покрывают экран, не отбрасывая пиксели?
Данияр
@danijar Да, у него есть небольшое преимущество перед использованием четырехугольника, потому что некоторые пиксели вдоль диагонали будут затенены дважды, если вы используете полноэкранный четырехугольник. С другой стороны, отбрасывание пикселей вне экрана является бесплатным, поскольку растеризатор не будет генерировать эти пиксели для начала.
Натан Рид
6

Трассировка лучей и другие методы обычно выполняются с помощью Compute Shaders, которые Direct3D поддерживает с момента выпуска D3D11, а OpenGL поддерживается начиная с 4.3 (и дольше благодаря использованию OpenCL и некоторых искажений).

Шон Миддледич
источник
5

Это звучит очень похоже на то, что вы хотите использовать вычислительный шейдер на GPU или использовать объект «Shader Storage Buffer», чтобы помочь расширить конвейер в соответствии с вашими потребностями. Подобные вещи используют математики, ученые и другие люди, которые обращаются к графическим процессорам за вычислениями, которые не совсем переводятся в стандартную графику.

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

http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders

Если это не укажет вам правильное направление, не могли бы вы расширить свою концепцию, которая не соответствует парадигме вершины / фрагмента?

AAorris
источник
Я отредактировал свой ответ, чтобы включить то, что я делаю. кажется, ответы на вычисления в шейдере, но просто скажите мне, есть ли что-то еще, что я могу сделать.
Легкая искра