Не существует прямого способа доступа к вершинам в вашем фрагментном шейдере, и вершинный шейдер работает только с 1 вершиной за раз и не имеет представления о целых примитивах.Фрагментный шейдер имеет дело только с фрагментами.
Вы можете выводить информацию о конкретной вершине и интерполировать ее в ваш фрагментный шейдер, например, как вы можете смешивать цвета по треугольнику или делать координаты текстуры.Часто вам все равно придется делать это смешивание в фрагментном шейдере, так что вы можете сделать это автоматически в вершинном шейдере.Вы можете получить фрагменты трехмерных координат пространства (но только фрагменты, а не окружающие вершины).
При этом вы можете прикрепить любую произвольную информацию к своим шейдерам.Например, в дополнение к позиции, нормалью и текстовым координатам у вас также может быть дополнительный атрибут, содержащий информацию о каждой вершине, которая должна быть доступна в определенной вершине.Если это может быть 3 набора по x, y, z, если это та информация, которую вы хотите, и число, указывающее, какой номер вершины в примитиве вы имеете дело (т.е. первые 2-я или 3-я вершины в треугольнике) и / или порядковый номерво всей сетке.Или это может быть просто порядковый номер, если вы этого хотите.Однако дополнительные атрибуты занимают больше памяти, поскольку вам придется дублировать данные вершин для каждой вершины в примитиве, чтобы гарантировать, что фрагментный шейдер имеет одинаковые данные из всех 3 его вершин.
Например, следующийатрибуты для каждой вершины (для примитивов треугольника):
v1, n1, uv1, v1, v2, v3, 0
v2, n2, uv2, v1, v2, v3, 1
v3, n3, uv3, v1, v2, v3, 2
v4, n4, uv4, v4, v5, v6, 0
v5, n5, uv5, v4, v5, v6, 1
v6, n6, uv6, v4, v5, v6, 2
Если вам нужны нормали или координаты текстуры, вам также необходимо дублировать это.
Также рассмотрите, что вы на самом деле делаете с вершинойинформация во фрагментном шейдере.Вместо того, чтобы отправлять данные для всех вершин, вы могли бы предварительно рассчитать ответ, который вы собираетесь вычислять в фрагментном шейдере, и вместо этого присоединить ответ в качестве атрибута и интерполировать его напротив вершинного шейдера во фрагментный шейдер.
Другой подход - сбросить все данные о вершинах в униформу и найти их.Вам, вероятно, все еще понадобится некоторая информация индекса, прикрепленная как атрибуты вершины, хотя он знает, какой индекс он должен искать.Также помните, что поиск будет медленным, поскольку он происходит каждый пиксель, и вы, вероятно, будете сталкиваться с коллизиями, поскольку каждая вершина будет искать информацию о тех, которые ее окружают.
В более новых версиях OpenGL (3.x +) Геометрические и тесселяционные шейдеры имеют доступ к такого рода информации и могут выводить ее на следующую вещь в конвейере шейдеров.
При этом сказано, что это поможет точно узнать, что вы пытаетесь достичь, поскольку оно даетпредставление о том, какие данные вершин необходимо передать фрагментному шейдеру.Также может быть гораздо более простой способ делать то, что вы хотите, не имея доступа к этим данным в фрагментном шейдере.