Как передать барицентрические координаты шейдеру AGAL? (Каркасный шейдер AGAL)

Я хотел бы создать эффект каркаса с помощью программы шейдера, написанной на AGAL для Stage3D.

Я искал в Google и понимаю, что могу определить, насколько близко пиксель находится к краю треугольника, используя барицентрические координаты (BC), переданные в программу фрагмента через программу вершин, затем раскрасьте ее соответствующим образом, если она достаточно близка.

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

Если бы я поместил BC в буфер вершин, это не имело бы смысла, поскольку они должны были бы быть разными в зависимости от того, какой треугольник визуализируется; например Vetex1 может потребоваться (1,0,0) при рендеринге с помощью Vetex2 и Vetex3, но другое значение при рендеринге с помощью Vetex5 и Vetex6. Возможно, я не совсем понимаю метод.

Нужно ли мне дублировать позиции вершин и добавлять дополнительные данные в буфер вершин, делая по существу 3 вершины на треугольник и утроив количество вершин? Всегда ли я даю вершине значение (1,0,0), (0,1,0) или (0,0,1) или это просто пример? Я не слишком усложняю это и есть ли более простой способ сделать каркас с помощью шейдеров и Stage3d?

Надеюсь, это полностью объясняет мои проблемы. Мы очень ценим ответы, спасибо!


person JimmyDeemo    schedule 18.01.2013    source источник


Ответы (2)


Все зависит от вашей геометрии, и эта проблема на самом деле является проблемой раскраски вершин графа: вам нужно, чтобы ваш геометрический граф был трехкратным. Хорошей отправной точкой является статья в Википедии.

Например, предположим, что базисный вектор (1, 0, 0) красный, (0, 1, 0) зеленый, а (0, 0, 1) синий. Очевидно, что если вы построите свою геометрию, используя следующий базовый элемент

базовый элемент графика

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

пример плитки

person skozin    schedule 06.02.2013
comment
Спасибо, что сломали это для меня. С изменением геометрии я могу этого добиться. - person JimmyDeemo; 10.02.2013

Вы наткнулись на вещь, которая сводит меня с ума в AGAL / Stage3D. Ограничения API не позволяют использовать общие вершины во многих случаях. Каркасный рендеринг - это один из примеров, когда что-то ломается ... но и простое плоское затенение - это еще один пример. Что вам нужно сделать, так это создать три уникальные вершины для каждого треугольника в вашей сетке. Для каждой вершины добавьте дополнительный параметр (или спроектируйте свой движок так, чтобы он принимал нормали вершин и повторно использовал их, поскольку вы, скорее всего, не будете затенять свой каркас).

Назначьте каждому треугольнику единичный вектор A [1,0,0], B [0,1,0] или C [0,0,1] соответственно. Это поможет вам начать. Обратите внимание: очевидное решение (определение порога в фрагментном шейдере и условное рисование пикселей) дает довольно уродливые результаты с псевдонимом. Посетите эту страницу, чтобы получить представление о методах сглаживания каркасов, визуализированных вашей программой фрагментов:

http://cgg-journal.com/2008-2/06/index.html

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

person jordancpaul    schedule 19.01.2013
comment
Спасибо за ответ. Итак, чтобы подвести итог, мне нужно было бы продублировать вершины и предоставить дополнительную информацию в буфере вершин? Точно так же, как я должен был бы поступить при установке нормалей для освещения? Спасибо за ссылку re: aliasing. - person JimmyDeemo; 21.01.2013
comment
Вам не нужно дублировать вершины для освещения, если вы вычисляете нормали вершин и выполняете плавное / гуро / затенение по фонгу. Сходство между барицентрическими координатами и картированием нормалей проявляется, когда вы пытаетесь реализовать плоское затенение. В этом случае вам нужно продублировать вершины для каждого треугольника и установить нормали всех трех (для каждого треугольника) вершин к нормали грани треугольника. Чтобы решить вашу барицентрическую задачу, вы устанавливаете векторы нормалей в A [1,0,0], B [0,1,0] и C [0,0,1]. Теперь, когда фрагментный шейдер выполняет интерполяцию, вы всегда сможете определить, где вы находитесь в треугольнике. - person jordancpaul; 22.01.2013