2015-10-12 5 views
2

В настоящее время у меня есть некоторые VAO и индексный список. Идея состоит в том, чтобы обрабатывать группы из 4 элементов в геометрическом шейдере. Способ выбора групп - если у меня есть список (1,2,3,4,5,6,7,8,...), тогда группы будут ((1,2,3,4),(5,6,7,8),...).Поместите 4 вершины в геометрический шейдер в OpenGL

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

+1

Вы можете объединить свои 4 вершины в одну большую «вершину» и передать их в виде точек в геометрический шейдер. – dari

+0

Я думаю, что это легко, если у вас нет индексного списка. В этом случае я бы просто поместил требуемые значения в том порядке, в котором я хочу, и установил, чтобы VAO читали большие куски. В случае индексированного списка (что необходимо в этой ситуации), как это сделать? – Gonzalo

ответ

2

Геометрические шейдеры do принимают примитивы с 4 вершинами в качестве входных данных: GL_LINES_ADJACENCY.

Этот примитивный режим может быть предназначен для линий, где вам нужны два соседних сегмента для каждого сегмента, но он не ограничен каким-либо конкретным вариантом использования - он просто предоставляет 4 вершины в качестве входных данных и может использоваться как таковой (он также может использоваться для эмуляции устаревшего примитивного режима GL_QUADS с геометрическими шейдерами).

+0

Спасибо! Я думал, что «GL_LINES_ADJACENCY» требует некоторых специальных свойств рендеринговой сетки. Таким образом, в конце концов, это всего лишь простая 4-х входная вершина для GS, и правильное значение «GL_LINES_ADJACENCY» может быть дано на более поздних этапах pipline (это не мой случай, так как я делаю преобразование обратной связи). – Gonzalo

+0

@Gonzalo: На самом деле, нет никакого «правильного значения» позже по трубопроводу. Единственное, что может дать примитиву ввода геометрического шейдера, - это сам геометрический шейдер. Значение «adjaceny» выполняется только в том случае, если вы фактически передаете информацию о соседних вершинах на каждый входной примитив. Но GL действительно все равно, что именно вы там положили, и если какой-нибудь другой примитив может поделиться данными или нет. Если вам действительно нужна смежность, это означает, что вам нужно избыточно указать такую ​​соседнюю информацию для каждого входного примитива. – derhass

+0

О, право. Я думал о линиях, поступающих в растеризатор, но, как вы говорите, геометрический шейдер может выводить что-то отличное от линий с смежностью. Таким образом, имя «GL_LINES_ADJACENCY» - это просто предложение о том, как использовать этот примитивный режим, хотя это и не ограничивается целями смежности. Спасибо! – Gonzalo