Вот фотография того, что у меня до сих пор. Есть ли способ заставить некоторые треугольники рисоваться после других?
Не беспокойтесь о промежутках между черными квадрациклами. Моя проблема связана с тем, что происходит там, где касаются красных, зеленых и синих областей. Вы можете видеть, что один квадрат находится за зеленым треугольником, а другой - за синим треугольником, но перед зеленым треугольником.
Все это происходит потому, что я беру 3 треугольника (красный, зеленый и синий) и тесселят и деформирует их в тесселяционных шейдерах, а затем нарисую квады в геометрическом шейдере. Квадрат всегда рисуется после присоединенного треугольника, но они всегда идут вместе, поэтому следующий треугольник, созданный тесселяцией, будет выше предыдущего квадранта.
Мой вопрос в том, есть ли способ избежать этого, кроме использования двух разных программ шейдеров? Похоже, что обратная связь преобразования может работать, например, преобразование треугольников в один буфер и квадранты в другой и их последующее объединение. Будет ли это работать? Будет ли это быстрее, чем переключение шейдеров? (Или иногда быстрее) Любые другие идеи?
EDIT: Извините, я делаю свой вопрос сложнее. В конце концов, когда я получу квадроциклы, ребра будут альфа-смешиваться, чтобы сглаживать. Поэтому в идеале ответ будет работать в этом сценарии.
EDIT 2: В окончательной версии три цветных треугольника будут рассматриваться вместе. В конце концов, они могут быть частью одного градиента или иметь текстуру, в ближайшей перспективе они всегда будут одного цвета. (Теперь есть цвета, чтобы помочь мне разобраться в том, что происходит.) Таким образом, некоторые трюки можно было сделать, предоставив информацию о цвете квадрантам в геометрическом шейдере, чтобы помочь в альфа-смешении, упомянутом выше. Это может позволить использовать буфер глубины. Извините, что не предоставил всю информацию раньше, я не привык задавать такие открытые вопросы.
Как вы их рисуете сейчас? В OpenGL все обратные вызовы происходят точно в том порядке, в котором вы их выдаете. – BDL
3 больших треугольника отправляются в шейдеры в патчах из 3 вершин, затем тесселяционный шейдер генерирует больше треугольников, в геометрическом шейдере я испускаю вершины для треугольника и, если необходимо, для четырехугольника. Я знаю, что призывы рисования происходят по порядку, но я не вижу способа заставить все квадратики рисоваться после треугольников, когда геометрический шейдер видит только один треугольник за раз. Следовательно, вопрос. –