Судя по названию в коде вашего шейдера и формулировке вашего вопроса, похоже, вы неправильно поняли концепцию вершинных шейдеров.
Вершинный шейдер вызывается один раз для каждой вершины. Таким образом, когда ваш код вершинного шейдера выполняется, он всегда работает с одной вершиной. Это означает, что имя вашей переменной in
вводит в заблуждение:
in vec2 vertices;
Эта переменная дает вам позицию единственной вершины, над которой работает ваш шейдер. Так что, вероятно, было бы понятнее, если бы вы использовали имя в единственном числе:
in vec2 vertex;
Как только вы поймете, что работаете с одной вершиной, все остальное станет проще. Для сравнения:
bool cmp() {
return (cmp_vertex == vertex);
}
Вершинные шейдеры обычно уже вызываются параллельно, а это означает, что многие экземпляры могут выполняться одновременно, каждый в своей вершине. Таким образом, нет необходимости в параллелизме внутри одного экземпляра шейдера.
У вас, вероятно, будет больше проблем с достижением того, что вам нужно. Но я надеюсь, что это поможет вам хотя бы преодолеть начальное препятствие.
Например, следующая переменная out
вызывает проблемы:
out int isEqual;
out
переменных вершинного шейдера имеют соответствующие in
переменные фрагментного шейдера. По умолчанию значение, записанное вершинным шейдером, линейно интерполируется по треугольникам, а фрагментный шейдер получает интерполированные значения. Это не поддерживается для переменных типа int. Они поддерживают только плоскую интерполяцию:
flat out int isEqual;
Но это, вероятно, не даст вам того, что вам нужно, поскольку значение, которое вы видите во фрагментном шейдере, всегда будет одинаковым для всего треугольника.
person
Reto Koradi
schedule
09.10.2015