Геометрический шейдер для нескольких примитивов

8

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

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;

Но если я использую этот шейдер, то линии или точки не будут отображаться. Итак добавив:

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;
layout(lines) in;
layout(line_strip, max_vertices=2) out;

Шейдер будет компилироваться и запускаться, но будет рендерить только строки (или что-то, что было определено последним примитивом).

Итак, как мне определить один геометрический шейдер, который будет обрабатывать несколько типов примитивов? Или это невозможно, и мне нужно создать несколько программ шейдеров и изменить программы шейдеров перед рисованием каждого типа?

MichaelHouse
источник

Ответы:

7

Я не верю, что OpenGL поддерживает геометрические шейдеры, которые выводят несколько типов примитивов. Я на самом деле удивлен, что ваш второй блок кода скомпилирован ... Возможно, он просто переписал конфигурацию?

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

Удачного кодирования!

kevintodisco
источник
2

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

При этом вам не нужно проделывать большую работу для поддержки нескольких примитивных типов. Благодаря ARB_separate_shader_objects вам больше не нужно связывать все свои стадии шейдера вместе. Вы можете иметь одну программу только для вершин, одну программу только для фрагментов и 2-3 программы только для геометрии, которые вы будете смешивать и сочетать вместе. Пока они используют совместимые интерфейсы, у вас все будет хорошо.

Николь Болас
источник