Простой плоский тесселяционный шейдер
Часть 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/
Я использовал этот подход, чтобы получить очень детализированный, но эффективный по памяти и кадрам рельеф.
Надеюсь это поможет.