Вопрос о новинке OpenGL: что такое отбраковка на заднем плане?
Что именно происходит с обратным лицом в OpenGL? Можете ли вы дать mi конкретный пример, например. один треугольник?
Ответы
Ответ 1
Если вы посмотрите внимательно, вы можете увидеть примеры этого во многих видеоиграх. Каждый раз, когда камера случайно перемещается по объекту - обычно движущийся объект, такой как персонаж, - замечает, как мир продолжает визуализировать правильно. Это потому, что задние стороны треугольников, которые образуют кожу персонажа, не отображаются; они эффективно прозрачны. Если это не так, то каждый раз, когда камера случайно перемещается внутри объекта, либо экран становится черным (потому что внутренняя часть объекта не горит), либо вы получите странную перспективу относительно того, как выглядит скин объекта изнутри.
Ответ 2
Отбраковка задней поверхности - это то, где треугольники, указывающие от камеры/точки обзора, не рассматриваются для рисования.
Wikipedia определяет это как:
Это шаг графического конвейера, который проверяет, отображаются ли точки в многоугольнике по часовой стрелке или против часовой стрелки при проецировании на экран. Если пользователь указал, что передние полигоны имеют обмотку по часовой стрелке, если полигон, проецируемый на экран, имеет против часовой стрелки обмотку, он повернут, чтобы смотреть в сторону от камеры и не будет нарисован.
Другие системы используют лицо обычным образом и делают точечный продукт с направлением просмотра.
Это относительно быстрый способ решить, нарисовать треугольник или нет. Рассмотрим куб. В любой момент времени 3 стороны куба будут обращены в сторону от пользователя и, следовательно, не видны. Даже если бы они были нарисованы, они были бы скрыты тремя "прямыми" сторонами. Выполняя отбрасывание задней поверхности, вы уменьшаете количество треугольников, оттянутых от 12 до 6 (2 на сторону).
Отбраковка задней поверхности лучше всего работает с закрытыми "твердыми" объектами, такими как кубы, сферы, стены.
Некоторые системы не имеют этого, поскольку считают грани двусторонними и, следовательно, видимыми с любого направления.
Ответ 3
Только он и техника оптимизации.
Когда вы смотрите на закрытый объект, скажем куб, вы видите только половину лиц: лица, которые к вам (или, по крайней мере, лица, которые не к вам, всегда закрыты другим лицом, которое указывает к вам)
Если вы пропустите рисунок всех обращенных назад лиц, это будет иметь два последствия:
- время рендеринга будет в два раза лучше (в среднем)
- окончательный рендер не изменится (так как другая лицевая сторона будет нарисована поверх "отбракованного" )
Итак, вы в основном получаете x2 perf бесплатно.
Чтобы узнать, является ли треугольник фронтальным или обратным, вы принимаете v0-v1 и v0-v2, создаете кросс-продукт. Это дает вам лицо нормальное. Если этот вектор направлен к вам (точка (нормальный, viewVector) < 0), вытяните.
Ответ 4
Треугольники имеют свои координаты, заданные в определенном порядке, по часовой стрелке IIRC.
Когда графический движок смотрит на треугольник в определенном направлении, а координаты против часовой стрелки, он знает, что он смотрит на заднюю часть треугольника через объект. Поскольку передняя сторона объекта покрывает треугольник, его не нужно рисовать.