2014-11-21 2 views
3

Я знаком с шейдерами вершин и фрагментов, но все еще смущен тем, как фрагментарный шейдер определяет количество фрагментов из вывода вершинного шейдера.Как фрагментарный шейдер определяет количество фрагментов из вывода вершинного шейдера?

Если у меня есть 3 вершины, и я рисую примитив треугольника в GLSL, то вершинный шейдер будет выполняться три раза для каждой вершины, а затем фрагментарный шейдер будет работать много раз (в зависимости от количества фрагментов, один раз для каждого фрагмента).

Я хочу знать, как фрагмент шейдера определяет фрагменты? Использует ли это gl_Position? Если я не установлю gl_Position в моем вершинном шейдере, то фрагментарный шейдер все равно сможет генерировать фрагменты или нет?

Обязательно ли устанавливать gl_Position каждый раз в вершинном шейдере?

ответ

10

Вы говорите о шаге в растеризации, известном как сканирование. GPU берет позиции, созданные вашим вершинным шейдером, и интерполирует их атрибуты для создания фрагментов, которые передаются в ваш шейдер фрагмента. Итак, да, для вас необходимо установить gl_Position в вершинном шейдере.

После преобразования координат треугольника в координаты окна преобразование сканирования принимает треугольник и разбивает его на основе расположения пикселов окна над выходным изображением, которое покрывает треугольник. Source.

scan conversion of a triangle

+0

Значит каждый переменной я прохожу через мой вершинного шейдера будет интерполировать на основе на gl_Position? Например, если я передаю координаты текстуры, используя out/in ключевые слова от вершины до фрагмента шейдера, они также будут интерполированы для каждого frament? – ammar26

+2

Да. Поскольку спецификатор интерполяции по умолчанию является «гладким», каждый входящий атрибут интерполируется с точки зрения перспективы. – warrenm

Смежные вопросы