Как получить вершины, из-за которых фрагментный шейдер вызывается в OpenGL ES? - PullRequest
3 голосов
/ 02 февраля 2012

Как в OpenGL ES получить вершины, из-за которых фрагментный шейдер вызывается из фрагментного шейдера?

Фрагментный шейдер, который появляется, не имеет связи с соответствующими ему вершинами?

Ответы [ 2 ]

6 голосов
/ 02 февраля 2012

Не существует прямого способа доступа к вершинам в вашем фрагментном шейдере, и вершинный шейдер работает только с 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 +) Геометрические и тесселяционные шейдеры имеют доступ к такого рода информации и могут выводить ее на следующую вещь в конвейере шейдеров.

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

2 голосов
/ 02 февраля 2012

Фрагментный шейдер действительно не имеет связи с вершинным шейдером, и вершинный шейдер является per-vertex без понятия общего набора, который создал этот фрагмент геометрии.Таким образом, вы не можете получить вершины, которые в конечном итоге породили этот экземпляр фрагментного шейдера.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...