Стадия вершинного шейдера в Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki

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

На входе вершинный шейдер получает информацию об одной вершине. В общем случае эта информация включает данные, выбранные для этой вершины из вершинных буферов, привязанных к стадии сбора исходных данных, и сгенерированные системой значения — идентификаторы вершин и экземпляров. Документация говорит, что в сумме на вход шейдера может поступать до 16 различных значений, каждое из которых может быть как скаляром, так и вектором (вплоть до 4-компонентного). Не совсем понятно, как это коррелирует с утверждением, что число входных слотов в DirectX 10.1 было увеличено до 32. возможно, дополнительные слоты позволяют использовать до 16 входных значений плюс до 16 дополнительных буферов, не обрабатываемых стадией сбора исходных данных, в то время как при 16 входных слотах общее число входных значений плюс дополнительных буферов не могло превосходить 16.

Вершинный шейдер возвращает информацию также об одной вершине. Максимальный объём этих данных такой же, как и для входа шейдера (то ли 16, то 32 значения), однако и их объём, и их набор может отличаться от набора входных данных.

Вершинный шейдер выполняется для каждой вершины, заданной входными буферами, независимо от того, относится ли данная вершина к какому-либо примитиву или является смежной для примитива. Центральный процессор может запросить количество обработанных вершин — значение VSInvocations.

Вершинный шейдер может производить выборку данных из памяти, используя функции HLSL Sample, SampleCmpLevelZero и SampleGrad.