Я работаю над проектом, где (и я немного упрощаю)
Мне нужно рассчитать сечения трехмерных фигур и отрисовать их. Например, у меня может быть список тетраэдров (каждый тетраэдр состоит из 4 вершин), или список треугольных призм (каждая треугольная призма состоит из 6 вершин), или список из n призм (каждая n призма состоит из 2 * n вершины) и т. д.
Я хочу рассчитать их двумерные сечения (двумерные сечения будут состоять из треугольников) и визуализировать сечения.
Самый простой и эффективный способ, который я придумал для этого, — это отправка трехмерных вершин в вершинный шейдер, затем отправка их в геометрический шейдер и получение там сечений. Однако для этого геометрический шейдер должен принимать примитивы с 4 точками или 6 точками (более 3 точек). Это проблема, потому что, насколько мне известно, геометрический шейдер может принимать только точки, линии и треугольники, и ничего с большим количеством точек. Я мог бы решить это, сохранив атрибуты нескольких трехмерных вершин в одной вершине GLSL, но это было бы очень сложно и не элегантно.
Есть ли способ для геометрического шейдера обрабатывать примитивы нестандартной длины, аналогичные примитивам патчей, используемым в шейдерах тесселяции? Я все еще буду выводить только треугольники из геометрического шейдера.
Примечание: кстати, я новичок в OpenGL, так что скажите мне, если я неправильно понял терминологию.
Изменить: под «поперечным сечением» я подразумеваю любое поперечное сечение вдоль плоскости, которое не обязательно выровнено с основаниями призм. Таким образом, в поперечном сечении будет иметь место переменное число треугольников. Например, плоскость может пересекать тетраэдр в 0, 3 или 4 точках, а геометрический шейдер (в идеале) будет принимать 4-точечные примитивы и выводить либо 0, 1, либо 2 треугольника. Кроме того, мой вопрос не имеет ничего общего с фактическим расчетом сечения. Я спрашиваю конкретно, есть ли способ использовать примитив с более чем 3 точками в качестве входных данных для геометрического шейдера. Наконец, это второй вопрос, который я написал, поэтому я не знаю, правильно ли я отформатировал. Извините, если нет!
Есть ли способ для геометрического шейдера обрабатывать примитивы пользовательских
длины, похожие на примитивы патчей, используемые в шейдерах тесселяции?
Если вы хотите работать с геометрическим шейдером, есть два простых способа добиться этого:
1) Использование triangles_adjacency в качестве входного примитивного типа вместо треугольники, который предоставляет вам 6 вершин на вызов геометрического шейдера. Обычно это используется для предоставления информации о смежности на трех краях текущего треугольника, но вы можете предоставить любые данные через буфер элементов. Смотрите здесь для быстрого обзора геометрических шейдеров.
2) Использование точки (или что-нибудь еще, в этом отношении) как тип входного примитива и использовать встроенную переменную gl_PrimitiveIDIn. Создайте буфер хранения шейдера, буфер текстуры или просто текстуру для хранения ваших данных геометрии и используйте этот примитивный идентификатор для доступа к данным для текущей фигуры. Если у вас есть фигуры с различным количеством вершин, вы можете использовать дополнительный индексный буфер, к которому вы обращаетесь с помощью примитивного идентификатора. Затем вы получаете доступ к буферу вершин со смещением, полученным из буфера индекса.
Второе решение, очевидно, является более гибким. Третий вариант — не делать этого в геометрическом шейдере. Вы выполняете вычислительный шейдер, скажем, один вызов для каждой фигуры, связываете доступные для записи буферы хранения шейдера для вершин и индексов, выполняете вычисления сечения в шейдере как обычно, сохраняете результирующую геометрию в буферах и затем рисуете сечение геометрия как обычно. Таким образом, вам не нужно проходить через вершинный шейдер, который преобразует вершины, которые вы не хотите визуализировать.
Других решений пока нет …