Простой плоский тесселяционный шейдер

Часть 1:

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

Плоская плоскость тесселяции

Как это обычно делается? Конечно, вам не следует на самом деле рисовать плоскость четырехугольников до программы шейдеров, так как, насколько я понимаю, квадраты не будут тесселированы таким образом, вместо этого тесселяция будет выглядеть следующим образом:

Четырехъядерный тесселяция

Я полагаю, что ответ мог бы состоять в том, чтобы нарисовать плоскость точек, и эти точки затем объединяются в несколько точек, и эти точки преобразуются в четырехугольники соответствующего размера в геометрическом шейдере, я думаю? В качестве альтернативы, вместо того, чтобы преобразовывать точки в четырехугольники, можно ли просто нарисовать четырехугольники между каждыми четырьмя ближайшими точками (что было бы намного лучше)? Примеры очень ценятся!

ПРИМЕЧАНИЕ. Использование только GLSL > 4.0 и C (без C++/Python)

Часть 2:

После того, как я получу работу с первой частью, как мне сделать так, чтобы одни квады были более тесселяционными, чем другие, такие как этот?

Я хочу, чтобы детали ближе к камере были более тесселяционными.

Часть 3:

Если бы мне удалось продвинуться так далеко, следующей частью было бы изменить ось z точек, чтобы превратить плоскость в интересное окружение. Это можно сделать, прочитав 2D-сэмплер, я знаю, как это сделать, и все. Однако, если я прав в части 1 об использовании плоскости точек, тогда мне нужно сделать больше, чем просто изменить точки, которые преобразуются в четырехугольники, потому что четырехугольники должны по существу делиться вершинами, чтобы не было промежутков между четырехугольниками. Как это будет сделано? В качестве альтернативы, если мы рисуем четырехугольники между точками, где каждая точка является высотой аппрайта, тогда это не будет проблемой.

1 ответ

Часть 1

Да, вы правы: сгенерируйте "патч" в виде простой сетки точек, задайте уровни тесселяции в виде униформы в TCS (шейдер управления тесселяцией) и сгенерируйте данные вершин в TES (шейдер оценки тесселяции).

Звучит сложно? Вот хороший учебник, на котором я основываю свою работу: http://antongerdelan.net/opengl/tessellation.html

Часть 2

Здесь вы говорите о LOD (или уровне детализации). Вам нужно будет выполнить тесселяцию и визуализировать нижний левый угол вашей сетки с большим количеством полигонов как отдельный объект.

Предлагаемый вами подход верен: разбейте общую сцену на "порции" и определите LOD (т.е. параметры тесселяции) для каждого порции отдельно, обычно по некоторому алгоритму расстояния до камеры.

Часть 3

Еще один отличный учебник, который делает именно то, что вы после того, как я верю: http://codeflow.org/entries/2010/nov/07/opengl-4-tessellation/

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

Надеюсь это поможет.

Другие вопросы по тегам