2016-06-18 9 views
1

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

Во время контроля тесселяции я проверяю ID на 0-11 и сохраняю положение и цвет вершины в позиции текущего идентификатора.

Я определяю glPatchParameteri(GL_PATCH_VERTICES, 3); и layout(vertices = 12) out; для моего шейдера управления тесселяцией, так как каждый треугольник тесселирован в 4 треугольника.

Похоже, что во время моей шейдерной оценки шейдеров массивы in vec3 tcPosition[]; и in vec3 tcColor[]; содержат правильные значения 12 в правильном порядке. Однако: как я могу связать их правильно во время оценки? Есть ли что-то вроде gl_primitiveID во время оценки тесселяции? Мне нужна замена для gl_primitiveID, которая равна 0 для всех сгенерированных вершин, поскольку они порождены из одного и того же патча. В настоящее время я просто использую информацию из первых трех вершин (0, 1, 2), но мне нужно будет сменить эти индексы на 3 после каждого сгенерированного треугольника.

void main(){ 
    vec3 p0 = gl_TessCoord.x * tcPosition[0]; 
    vec3 p1 = gl_TessCoord.y * tcPosition[1]; 
    vec3 p2 = gl_TessCoord.z * tcPosition[2]; 
    tePosition = p0 + p1 + p2; 
    teColor = gl_TessCoord.x * tcColor[0] + gl_TessCoord.y * tcColor[1] + gl_TessCoord.z * tcColor[2]; 
    gl_Position = mvp * vec4(tePosition, 1); 
} 

Любые идеи или идеи, как умно мозаике треугольника такие, что я позже возможность использовать преобразование обратной связи для пинг-понга рендеринга высоко ценятся.

ответ

1

Я посылаю треугольник по трубопроводу и хочу его тесселить в прокладку серпинского.

Остановить. Вы не можете сделать это.

Trissgle tessellation не выполнен таким образом, чтобы вы могли его сгенерировать. Модель particular tessellation algorithm required for tessellation предназначена для упрощения соединения кромок. Он также предназначен для обеспечения адаптивной и плавной тесселяции.

Sierpinski triangles не имеют этих свойств.

Если вам нужен такой строгий контроль над точными средствами тесселяции, я бы предложил сделать тесселяцию на процессоре. ГС не сможет точно тесселировать треугольник; большинство реализаций OpenGL не позволяют GS выводить много треугольников, даже с geometry shader instancing.

Что касается особенностей Вашего вопроса:

Я определяю glPatchParameteri(GL_PATCH_VERTICES, 3); и расположение (вершины = 12) из; для моего шейдера управления тесселяцией, поскольку я хочу, чтобы каждый треугольник был разбит на четыре треугольника.

Это не так, как работает тесселяция.

Каждый патч, который не достигает tessellation primitive generator (шаг после ТКС), независимо от того, сколько вершин имеет, считается единственный примитив быть мозаичные. Ваш TCS здесь выводит 12 вершин в патче, но сам патч по-прежнему будет единственным треугольником.

Позволяя вам контролировать количество вершин, вы можете определить, что означает «вершина» для вашего алгоритма тесселяции. Например, поверхность Безье имеет 16 контрольных точек вершин, но это все еще квад. Это позволяет TES на основе Безье принимать все 16 контрольных точек в качестве входов при создании вершинных позиций.

Кроме того, тесселяция не работает в зависимости от того, сколько треугольников вы получите. Он работает на основе того, сколько подразделение вы хотите. Это то, что определяет внешний и внутренний уровни тесселяции: количество сегментов, к которым будут привязаны края треугольника.

Однако: как я могу связать их правильно во время оценки?

Входы TES: одинаковые значения TCS написал. В том же порядке.

Способ работы тесселяции заключается в том, что тесселированные не являются вашими вершинами, написанными TCS. Тосселируется abstract patch. Генератор примитивов тесселяции генерирует «вершины» относительно абстрактного патча.

gl_TessCoord - это то, что позволяет обнаружить, где конкретный вызов TES: в пределах абстрактный патч. Затем вы комбинируете это с выходными данными TCS (которые являются входами в TES) для генерации значений вершин, необходимых для этой координаты.

Мне нужна замена для gl_primitiveID, которая равна 0 для всех сгенерированных вершин, поскольку они порождены из одного и того же патча.

Это уже делает это. gl_PrimitiveID будет одинаковым для каждого обращения TES в одном патче.

+0

Благодарим вас за подробный отзыв. Это помогло мне не вкладывать дополнительные дни в попытку найти способ сделать работу тем, что не может работать. Я буду продолжать работу с GS, как я знаю, для количества уровней рекурсии, в которых я нуждаюсь, это может быть сделано вместе с рендерингом пинг-понга (один проход испускает 12 вершин на треугольник, а затем результат считывается с обратной связью преобразования, а затем начинается полностью новая итерация). – NoxMortem

+1

@NoxMortem: «* один проход испускает 12 вершин на треугольник, а затем результат считывается с обратной связью преобразования, затем начинается совершенно новая итерация *« ... В этот момент было бы быстрее использовать процессор. Все, что останавливается, прежде чем вы сможете начать следующую итерацию, будет медленнее, чем оптимизированный алгоритм процессора. Или, по крайней мере, вы можете использовать Compute Shader. –