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

Я пытаюсь визуализировать кубическую поверхность Безье с помощью шейдера геометрии, поэтому у меня есть 16 контрольных точек, которые все являются vec3s, я меняю их на vec4s с w = 1, добавленным в вершинный шейдер.

и вот проблема:

геометрический шейдер принимает массив вершин в форме примитивов, верно? (таких как точки, линии, треугольники), и они могут получить максимум 6 вершин (случай смежности треугольников) каждый раз, НО я должен знать все 16 вершин (которые являются контрольными точками кубической поверхности Безье), прежде чем я что-нибудь нарисую.

Как я могу решить эту проблему? glDrawArrays() не та функция, которую мне следует использовать?


person rookie_luck    schedule 20.10.2020    source источник


Ответы (1)


Для простой кривой это выполнимо следующим образом: рендеринг 2D кубического БЕЗЬЕ с GLSL

Так что, возможно, вы могли бы попробовать сделать что-то подобное. Например:

  1. на CPU передать полигон с 16 точками на патч на GPU

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

  2. в шейдере геометрии генерируется BBOX + матрицы коэффициентов

    поэтому вы испускаете один QUAD или несколько треугольников или что-то еще, покрывающее площадь патча ... Но вместо исходных 16 точек вы передаете предварительно вычисленные матрицы коэффициентов.

  3. в фрагментном шейдере

    вычислить ближайшее расстояние до поверхности и выполнить рендеринг или discard.

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

person Spektre    schedule 21.10.2020