2010-09-27 6 views
5

Я новичок в OpenGL. Я использую его с JOGL.Confused about Frustum Culling

Я читаю о усеченного выбраковки:

http://www.lighthouse3d.com/opengl/viewfrustum/

http://www.crownandcutlass.com/features/technicaldetails/frustum.html

Я не уверен, что именно он должен делать. Не закрывает ли OpenGL объекты за пределами экрана? (Это отбраковывается значительно медленнее, чем просто не отправляя объекты в первую очередь?)

Из того, что я читаю, это не похоже на то, что это позволит избежать рисования объектов, которые затенены за другим, но находятся в пределах просмотр усеченного конуса. Означает ли это, что единственное преимущество заключается в том, чтобы избежать отправки объектов с экрана в OpenGL?

+0

Вторая ссылка сохранить мой день, спасибо! :-) –

ответ

1

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

4

Да, вы в основном правы. Отверстие Frustum отсекает объекты, находящиеся за пределами пирамиды камеры. OpenGL при рендеринге сцены, конечно, делает это также, но на основе каждой вершины. Таким образом, отборные работы на предмет объекта и его потенциал повышения производительности значительно выше.
Одним из узких мест является передача данных между процессором и графическим процессором. Если вам нужно перенести, например, только 1/4 всех объектов/вершин на наружной сцене, отбраковка усеченного конуса может дать хороший прирост производительности.

3

Самый быстрый объект - тот, который вам не нужно рисовать вообще.

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

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

3

Да - удаление усеченного конуса только удаляет объекты, которые лежат целиком вне смотрового усечения. Ничего больше или меньше. Да, вы можете повысить производительность по сравнению с OpenGL, особенно если вы можете отбирать большее количество элементов одновременно (например, библиотека просмотра может очень быстро отрубить целые ветви графика).

is также устраняет треугольники, которые удаляют треугольники (или что-то еще), которые обращены в сторону от зрителя, но это отдельно от отбраковки усеченного конуса.

Существует несколько способов обращения с объектами, которые затенены другими объектами. Окклюзионное отбракование является самым простым, но OpenGL ничего не делает, чтобы поддерживать его напрямую (хотя какое-то оборудование делает это как расширение). Другой - буфер глубины, который OpenGL поддерживает напрямую. Разница в том, что отключение окклюзии смотрит на весь объект и вообще не отображает его, если он полностью закрыт. Буфер глубины работает по принципу «фрагмент-за-фрагмент», поэтому он выполняется только после того, как вы (почти) полностью визуализировали объект. В зависимости от того, сколько объектов вы имеете в виду (и таких), делая свою собственную окклюзию, выбивание может, таким образом, быть довольно большой победой (так как это может избежать большого количества рендеринга, которое необходимо, прежде чем буфер глубины сможет выполнить свою задачу).