Вопрос новичка в OpenGL: что такое отбор задней грани ?

Что именно является выборкой задней грани в OpenGL? Можете ли вы привести мой конкретный пример, например, с одним треугольником?

15
задан fhucho 29 August 2010 в 14:18
поделиться

4 ответа

Если вы внимательно посмотрите, то увидите примеры этого во многих видеоиграх. Каждый раз, когда камера случайно перемещается через объект — обычно это движущийся объект, например персонаж, — обратите внимание, как мир продолжает отображаться правильно. Это потому, что обратные стороны треугольников, образующих скин персонажа, не визуализируются; они эффективно прозрачны. Если бы это было не так, то каждый раз, когда камера случайно перемещалась внутри объекта, либо экран становился бы черным (потому что внутренняя часть объекта не освещена), либо вы бы получали причудливую перспективу того, как выглядит кожа объекта. изнутри.

16
ответ дан 1 December 2019 в 02:01
поделиться

Координаты треугольников указаны в определенном порядке по часовой стрелке IIRC.

Когда графический движок смотрит на треугольник с определенного направления, а координаты идут против часовой стрелки, он знает, что смотрит на обратную сторону треугольника сквозь объект. Поскольку передняя сторона объекта закрывает треугольник, его не нужно рисовать.

1
ответ дан 1 December 2019 в 02:01
поделиться

Отбраковка задней грани — это когда треугольники, направленные в сторону от камеры/точки обзора, не учитываются при рисовании.

Википедия определяет это как:

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

Другие системы используют нормаль к лицу и выполняют скалярное произведение с направлением взгляда.

Это относительно быстрый способ решить, рисовать треугольник или нет. Рассмотрим куб. В любой момент 3 стороны куба будут обращены от пользователя и, следовательно, не видны. Даже если бы они были нарисованы, они были бы закрыты тремя обращенными «вперед» сторонами. Выполняя отбраковку обратной грани, вы уменьшаете количество нарисованных треугольников с 12 до 6 (по 2 на сторону).

Отсечение задней грани лучше всего работает с закрытыми «твердыми» объектами, такими как кубы, сферы, стены.

В некоторых системах этого нет, поскольку они считают лица двусторонними и, следовательно, видимыми с любого направления.

12
ответ дан 1 December 2019 в 02:01
поделиться

Это всего лишь метод оптимизации.

Когда вы смотрите на закрытый объект, скажем, на куб, вы видите только половину граней: грани, которые обращены к вам (или, по крайней мере, грани, которые не обращены к вам, всегда закрыты другой гранью, указывающей на вас). к вам)

Если вы пропустите рисование всех этих обращенных назад лиц, это будет иметь два последствия: - время рендеринга уменьшится в два раза (в среднем) - окончательный рендер не изменится (поскольку другая, фронтальная грань будет отрисовываться поверх «отбракованной»)

Таким образом, вы фактически получаете производительность x2 бесплатно.

Чтобы узнать, является ли треугольник лицевой или изнаночной стороной, вы берете v0-v1 и v0-v2, делаете перекрестное произведение. Это дает вам нормальное лицо. Если этот вектор направлен к вам (dot(normal, viewVector) < 0), нарисуйте.

2
ответ дан 1 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: