9.6. Операции с пикселями в OpenGL
9.6.5. Использование буферов в процедуре указания объекта Поработав некоторое время с буферами и набравшись опыта, вы убедитесь, что с их помощью можно выполнять практически любые процедуры формирования и модификации изображения. Но операции с буферами могут использоваться и при выполнении интерактивных процедур. Рассмотрим самую распространенную из них - указание графического объекта на экране. При выполнении этой процедуры система должна вернуть прикладной программе идентификатор того графического объекта, на котором находится курсор (маркер положения мыши). В составе API OpenGL имеется механизм поддержки обратной связи между растровым изображением и описанием геометрических объектов сцены с помощью специальных списков (hit lists). Выбранный способ поддержания обратной связи объясняется особенностями работы геометрического конвейера при формировании изображения. При появлении запроса на выполнение процедуры указания организуется повторный цикл формирования изображения, но если в изображении не слишком много геометрических объектов, то эту задачу можно решить и иным способом, воспользовавшись буферами.
Предположим, что в изображение входит не более 256 объектов (примитивов), т.е. за каждым объектом можно "закрепить" уникальный 8-разрядный идентификатор. В программе организуется дополнительный 8-разрядный двоичный pick-буфер, размер которого соответствует разрешающей способности изображения, т.е. за каждым пикселем изображения будет "закреплена" 8-разрядная ячейка. При формировании экранного образа очередного примитива синхронно с заполнением буфера кадра в одноименные ячейки pick-буфера записывается код идентификатора примитива (объекта). Располагая таким буфером, не представляет труда, пользуясь описанными выше функциями OpenGL, считать по заданным координатам курсора мыши идентификатор объекта, образ которого включает эту точку экрана. Если объединить этот процесс с алгоритмом z-буфера, то из всех объектов, проецирующихся в указанную точку, можно выбрать тот, который ближе всех расположен к камере.