Оба графических API (OpenGL и DirectX) создают четко определенный конвейер, в котором программируются несколько этапов. Эти программируемые каскады требуют принятия фиксированного минимального объема данных и должны выполнять четко определенный диапазон операций над ним и выводить некоторый определенный минимальный вывод, чтобы данные могли быть правильно переданы на следующую ступень. Кажется, что эти конвейеры предназначены для работы только с ограниченным количеством типов геометрических данных, которые в случае как D3D, так и OGL являются вершинными данными и координатами текстуры.
Но, если дан случай, когда приложение, которое я планирую сделать, не использует вершины (или даже воксели) для представления своих геометрических данных и не выполняет точно преобразования, проекции, растеризацию, интерполяцию или что-либо подобное, такие ограничения API-интерфейсов или трубопровод усложнит ситуацию.
Итак, есть ли способ, которым мы можем изменить графический конвейер таким образом, чтобы функциональные возможности каждого этапа с данными и тип данных, выводимых на каждом этапе, менялись в моих интересах? Если нет, то есть ли способ, с помощью которого я могу использовать «сырые» функции API для создания собственного конвейера? Если нет, то, пожалуйста, укажите, почему это невозможно.
РЕДАКТИРОВАТЬ : Мое приложение использует функции плотности для представления геометрии. Функция имеет значение в каждой точке пространства. Я делю усечку камеры на 3-ю сетку, каждый блок может быть спроецирован как пиксель. В каждом блоке я интегрирую функцию плотности и проверяю, превышает ли ее значение требуемое значение. Если да, то предполагается, что что-то существует в этом блоке и что пиксель, соответствующий этому блоку, визуализируется. Итак, теперь в моем рендерере я хочу передать функцию (которую я представляю строкой) графическому оборудованию вместо данных вершин в буферах вершин. это также подразумевает, что у вершинного шейдера не будет вершин для преобразования в однородное пространство клипа, а фрагментный шейдер не получит информацию о пикселях. вместо этого, теперь большая часть поиска и оценки происходит на пиксель.
Ответы:
Вы можете абсолютно использовать графический процессор для визуализации объемных данных.
Поскольку вы хотите оценить набор функций на пиксель на экране, простой подход состоит в том, чтобы отобразить полноэкранный треугольник. Это всего лишь один треугольник, который покрывает весь экран (на самом деле, он покрывает больше, чем экран, поскольку экран не является треугольным, но части вне экрана отбрасываются графическим процессором). Затем вы можете использовать пиксельный шейдер (который получает экранные координаты пикселя, который он затеняет), чтобы построить луч через ваш объем, оценить функции, все, что вам нужно сделать.
(В отличие от других ответов, я не рекомендую вычислительный шейдер, потому что он звучит так, как будто вы хотите выполнять операции с пикселем, а полноэкранный треугольник + пиксельный шейдер обычно более эффективен, чем вычислительный шейдер, хотя Вычислительные шейдеры наверняка тоже подойдут.)
Метод полноэкранного треугольника очень распространен в графике в реальном времени для операций постобработки, поэтому вы, вероятно, сможете найти всю необходимую вам информацию, немного погуглив.
Кстати, вас может заинтересовать чтение « Рендеринга миров с двумя треугольниками » Иниго Куилеса, доклад, в котором описано, как визуализировать трехмерные сцены, созданные с использованием математических функций (в частности, полей расстояния), с использованием техники полноэкранного пиксельного шейдера.
источник
Трассировка лучей и другие методы обычно выполняются с помощью Compute Shaders, которые Direct3D поддерживает с момента выпуска D3D11, а OpenGL поддерживается начиная с 4.3 (и дольше благодаря использованию OpenCL и некоторых искажений).
источник
Это звучит очень похоже на то, что вы хотите использовать вычислительный шейдер на GPU или использовать объект «Shader Storage Buffer», чтобы помочь расширить конвейер в соответствии с вашими потребностями. Подобные вещи используют математики, ученые и другие люди, которые обращаются к графическим процессорам за вычислениями, которые не совсем переводятся в стандартную графику.
http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders
Если это не укажет вам правильное направление, не могли бы вы расширить свою концепцию, которая не соответствует парадигме вершины / фрагмента?
источник