Метод иерархического г-буфера использует сразу все три типа когерентности в сцене - в картинной плоскости (г-буфере), в пространстве объектов и временную когерентность.
Назовем грань скрытой (невидимой) по отношению к 2-буферу, если для любого пиксела картинной плоскости, накрываемого этой гранью, глубина соответствующего пиксела грани не меньше значения в 2-буфере. Ясно, что выводить скрытые грани не имеет смысла, так как они ничего не изменяют (они заведомо не являются видимыми).
Куб (прямоугольный параллелепипед) назовем скрытым гго отношению к г-буферу, если все его лицевые грани являются скрытыми по отношению к этому 2-буферу (рис. 10.25).
Опишем куб вокруг некоторой группы граней. Перед выводом граней, содержащихся внутри этого куба, стоит проверить, не является ли куб скрытым. Если он скрытый, то все грани, содержащиеся внутри его, можно сразу же отбрасывать.
Но даже если куб не является скрытым, часть граней, содержащихся внутри его, все равно может быть скрытой, и поэтому нужно разбить его на части и проверить каждую из частей на скрытость.
Предложенный подход приводит к следующему алгоритму.
Опишем куб вокруг всей сцены. Разобьем его на 8 равных частей. Каждую из частей, содержащую достаточно много граней, снова разобьем и т. д. Если число граней внутри частичного куба меньше заданного числа, то разбивать его нет смысла и он становится листом строящегося дерева. В результате получается восьмеричное дерево, где с каждым кубом связагг список граней, содержащихся внутри его.
Вывод всей сцены можно представить следующим образом: очередной куб, начиная с корня дерева, проверяется на попадание в область видимости. Если куб в область видимости не попал, то ни одна грань из него не видна и мы его отбрасываем. В противном случае проверяем, не является ли этот куб скрытым. Скрытый куб также отбрасывается. В противном случае повторяем описанную процедуру для всех его восьми частей в порядке удаления - первым обрабатывается ближайший подкуб, последним - самый дальний. Для куба, являющегося листом, вместо вывода его частей просто выводим все содержащиеся в нем грани.