Как в OpenGL ES 2.0 нарисовать каркас из треугольников, кроме линий на соседних копланарных гранях?

Я смутно припоминаю, что видел что-то в OpenGL (не ES, который все еще был в версии 1.0 на iPhone, когда я наткнулся на это, поэтому я никогда им не пользовался), что позволяло мне указать, какие ребра моих полигонов считать контурами, а какие нет. составляли внутреннюю часть лиц. Таким образом, это не то же самое, что контур всей модели (что я знаю, как сделать), а скорее контур плоской грани со всеми ее треугольниками, в основном смешанными в один полигон. Например, в кубе, состоящем из треугольников, каждая грань на самом деле состоит из двух треугольников. Я хочу отобразить контур квадрата, но не диагональ на лице. То же самое с шестигранником. Для этого нужно четыре треугольника, но только один контур для лица.

Теперь да, я знаю, что могу просто проверить все ребра, чтобы увидеть, имеют ли они общие копланарные грани, но я мог бы поклясться, что видел где-то, когда вы задавали данные трехмерной сетки, где вы могли бы сказать: «Эта линия очерчивает лицо, тогда как эта один находится внутри лица. Таким образом, при рендеринге вы можете установить флаг, который в основном говорит: «Дайте мне каркас, но только провода по краям полных граней, а не вокруг треугольников, из которых они состоят».

Кстати, моя цель — все платформы, поддерживающие OpenGL ES 2.0, но моя платформа разработки — iOS. Опять же, я почти уверен, что изначально это было в OpenGL и, возможно, обесценилось после появления шейдеров, но я даже не могу найти ссылку на эту функцию, чтобы проверить, так ли это.

Единственный способ, который я знаю сейчас, это иметь один набор вершин, но два отдельных набора индексов... один для рендеринга треугольников, а другой для рендеринга каркасов граней. Это настоящая боль, так как я заканчиваю тем, что вручную много кодирую, что опять же, я на 99% уверен, что вы можете определить при рендеринге линий.


person Mark A. Donohoe    schedule 30.07.2011    source источник


Ответы (1)


GL_QUADS, glEdgeFlag и glPolygonMode не поддерживаются в OpenGL ES.

Вы можете использовать LINES для рисования каркаса: чтобы получить скрытые линии, сначала нарисуйте треугольники с черной заливкой (с включенной DEPTH), а затем нарисуйте интересующие вас ребра с помощью GL_LINES.

person whoplisp    schedule 30.07.2011
comment
Неа! ES 2.0 не поддерживает квадроциклы. Кроме того, это будет работать только для квадрата. Мне нужно, чтобы это работало для любого определенного лица с копланарным треугольником. Опять же, я помню, что видел его для OpenGL, потому что был очень расстроен тем, что его не было в ES 1.0. Я надеюсь, что они добавили что-то в ES 2.0 для этого. (С другой стороны, возможно, это была часть OpenGL, которая обесценилась после появления шейдеров и тому подобного. Проблема в том, что я даже не могу найти оригинал, чтобы проверить!) - person Mark A. Donohoe; 30.07.2011
comment
Извините, я не знал, что QUADS не существует. khronos.org/registry/gles/specs/2.0/es_cm_spec_2. 0.24.pdf на странице 4 говорится: Примитивы QUADS, QUAD STRIP и POLYGON не поддерживаются. Однако LINES по-прежнему поддерживаются. Вы могли бы использовать их. - person whoplisp; 30.07.2011
comment
Я знаю, что могу использовать линии... это не проблема. Проблема в том, что три состоит из трех строк. Однако в случае квадрата каждый из двух треугольников имеет только две линии, которые находятся на краю грани. В-третьих, диагональная гипотенуза находится на самой грани. Существует способ при рендеринге линий сказать, что это линия внутренней грани, которую вы можете выбрать для рендеринга или нет, без необходимости возвращаться назад и определять второй набор индексов, которые определяют только внешние края. Это то, что я снова пытаюсь найти, но быстро ничего не получаю. - person Mark A. Donohoe; 30.07.2011
comment
Другими словами... Я могу определить набор линий один раз и просто установить флаг, чтобы отобразить все ребра треугольника или только ребра вокруг лица. Простите меня за излишнее излишество, но я хочу убедиться, что все понимают, что я пытаюсь найти. Опять же, это была особенность OpenGL. Просто не могу вспомнить, что это было. - person Mark A. Donohoe; 30.07.2011
comment
Кажется, я нашел ответ на той же странице спецификации ES: флаги Edge не включены, так как они используются только при рисовании полигонов в виде контуров, а поддержка PolygonMode не включена. [...] Устранение четырехугольников и многоугольников устраняет особые случаи для рисования в линейном режиме, требующие краевых флагов (если PolygonMode будет повторно установлен). Я думаю, что вы не могли вспомнить функцию glEdgeFlag. - person whoplisp; 30.07.2011
comment
Упс! Ты был прав. Я вижу, что в вашем ответе (если вы его не редактировали!) Это был glEdgeFlag, и он не работает с массивами, только прямой режим, который не поддерживается ES, следовательно, glEdgeFlag также не поддерживается ES. Думаю, это вручную указывает два разных массива... один для граней, один для ребер. Тем не менее, я отмечаю ваш ответ как минимум за то, что нашел его. - person Mark A. Donohoe; 31.07.2011
comment
Не ой! Я только что узнал об этом во время нашего обсуждения. Затем я отредактировал свой ответ, чтобы другим людям не приходилось анализировать все эти комментарии. - person whoplisp; 31.07.2011