Для чего используются шейдеры Hull, Domain и Geometry?

21

Я выполнил свою справедливую долю программ по 3D-играм для моего (бывшего) работодателя, а также в своих собственных движках для своих собственных инди-игр.

Первоначально я начал с Direct3D 9 и D3DX9, которые в значительной степени сделали все для меня, и не требовали, чтобы я вообще думал о шейдерах.

После этого я написал свои первые шейдеры Direct3D 9, но в основном использовал один очень простой шейдер для всего, что я делал.

В самой последней итерации моего игрового движка я перешел на Direct3D 11, и с этим я создал много шейдеров. Я делал скины для GPU, вычислял частицы в GPU, много эффектов освещения и постобработки, все в GPU. Действительно классные вещи.

До сих пор я использовал только вершинные и пиксельные / фрагментные шейдеры. Несмотря на то, что есть еще много вещей, которые я еще не сделал, я думаю, что у меня есть четкие знания о том, что делают вершинные и пиксельные / фрагментные шейдеры, и как все это вписывается в весь 3D конвейер.

Догоняя последние разработки, я очень заинтересовался новыми этапами шейдера. То есть шейдер Geometry, и еще новее шейдеры Hull и Domain.

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

Я предполагаю, что основным использованием геометрического шейдера будет программная генерация геометрии в графическом процессоре. Распространенным применением было бы создание квадратов билбордов на основе одной вершины, но я на самом деле не представляю много других распространенных сценариев, кроме генерации фракталов и других вещей, которые вы можете генерировать на 100% программно.

Что касается шейдеров Hull и Domain, кажется, что они связаны с тесселяцией (создание более гладких поверхностей из шероховатых поверхностей?) И должны использоваться вместе или не использоваться вообще. Термин «патч» также, кажется, распространен здесь.

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

Панда Пижама
источник
Я думаю, что вы спрашиваете неправильный путь - вместо того, «для чего они используются», вы должны спрашивать «что они делают» - если вы понимаете данные ресурсы (и их концепции под капотом), только небо ограничивает то, чем вы являетесь на самом деле в состоянии с ними делать.
Wondra
@wondra: Это почти тот же вопрос, но я хотел бы сосредоточиться больше на практических примерах использования, а не на теоретическом объяснении того, что они делают. На самом деле, есть обзор MSDN, который я читал много раз, но до сих пор не могу понять, что они могут сделать для меня. Я - разумное существо, и я могу соединить A и B и выяснить C, D, E и F из этого.
Панда Пижама
Я не знаю, «примеры практического использования» мне кажется немного широким. Я сделал удар, хотя, но перед этим комментарием, поэтому он может быть слишком сосредоточен на том, «что они делают» для вашего.
@Josh: Используете ли вы, или вы использовали все эти этапы в реальном мире?
Панда Пижама
1
К сведению тех, кто имеет опыт работы не в DirectX (как и я), эти два в OpenGL и Vulkan называются «шейдер управления тесселяцией» и «шейдер оценки тесселяции».
Шахбаз

Ответы:

13

Корпус и Домены

Стадии оболочки и доменного шейдера являются частью конвейера тесселяции графического процессора. Они обычно используются для вычисления геометрии поверхности с высокой степенью детализации на основе геометрии входной поверхности с меньшей степенью детализации, которая определяется как треугольники или квадраты (и так далее). Входные примитивы с более низкой детализацией называются «заплатками», и важно отметить, что они могут не представлять фактическую геометрию , которая в конечном итоге будет существовать (хотя они могли бы). Думайте больше как контрольные точки кривой Безье, за исключением поверхности.

Шейдер корпуса принимает входной патч и создает выходной патч (или патчи; именно здесь обычно происходит подразделение патча). Постоянные метаданные о патче также могут быть вычислены в шейдере корпуса и выведены для обработки на более поздних этапах конвейера.

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

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

Фаза тесселяции происходит после стадии вершинного шейдера в конвейере.

Геометрические шейдеры

Геометрические шейдеры, в некотором смысле, похожи на упрощенные шейдеры оболочек / доменов. Они просто принимают входные вершины и создают выходные вершины. Для заданной входной вершины может быть создано много выходных вершин, поэтому их можно использовать для «генерации геометрии».

Этап геометрического шейдера происходит после вершинного шейдера и после этапа тесселяции.

Пользы

Геометрический шейдер может записывать в выходные буферы потока вместо того, чтобы вводиться непосредственно в фазу растеризации и затенения фрагмента конвейера; это фактически означает, что вы можете повторно запустить геометрию, созданную комбинацией итерации вершинного / оболочечного / доменного / геометрического шейдера, обратно по конвейеру, чтобы выполнить дополнительную работу на другом этапе вершинного шейдера или чего-либо еще.

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

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

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

Для дальнейшего чтения, включая гораздо больше подробностей, чем я могу разумно вспомнить или перейти здесь:


источник
4
Помните, что шейдерам оболочки и домена требуется аппаратное обеспечение Direct3D Feature Level 11.0 или более поздней версии, а геометрическим шейдерам требуется аппаратное обеспечение Direct3D Feature Level 10.0 или более поздней версии. Кроме того, большинство конструкций видеокарт практически не дают стадии геометрического шейдера отсутствию выделенного оборудования, поэтому на практике их полезность намного меньше, чем предполагалось изначально.
Чак Уолборн
@ChuckWalbourn: Мне бы очень хотелось услышать больше, если хотите, отдельного ответа
Panda Pajama