Android OpenGL ES 1.1: чтение из буфера трафарета - PullRequest
4 голосов
/ 30 января 2012

Использование Android OpenGL ES 1.1 (HTC Desire) ...

Проблема, которая у меня вообще есть, такова:

У меня есть различные 3D-объекты, которые отображаются в сложной сцене. Я хочу проверить, нажал ли пользователь на конкретный объект. Этот объект может быть частично скрыт и, следовательно, может выглядеть как практически любая фигура на сцене. Я хочу разрешить выбор объекта только в том случае, если пользователь нажимает на часть объекта, видимую на сцене. Это означает, что я не могу использовать векторные вычисления для пересечения объектов, поскольку они не могут легко учитывать скрытые области объекта.

Итак, у меня возникла идея ...

Я настроил буфер трафарета таким образом, чтобы там, где объект был виден, буфер трафарета был заполнен единицами, а везде в буфере трафарета - 0. Когда пользователь нажимает на определенный пиксель в сцене, мне просто нужно проверить трафаретный буфер, чтобы видеть, содержит ли он 1 или 0, который указывает, был ли объект нажат или нет.

Это прекрасно работает на ПК, но на Android OpenGL ES 1.1 кажется, что я не могу читать из буфера трафарета с помощью glReadPixels (), поскольку GL_STENCIL_INDEX не поддерживается.

Кто-нибудь знает, есть ли способ прочитать это 0/1 из буфера трафарета? Или кто-нибудь может придумать лучший алгоритм определения, был ли нажат мой объект?

Большое спасибо

1 Ответ

1 голос
/ 28 марта 2012

Вы можете реализовать тот же алгоритм с использованием цветового буфера.

Создать FrameBuffer.Рендеринг сцены в нее, но нарисуйте каждый объект с отличным цветом.Цвет не должен совпадать с фактическим цветом объекта, потому что то, что вы рисуете в кадровом буфере, предназначено не для глаз, а только для поиска мышью.Как только вся сцена прорисована, считайте пиксели, используя glReadPixels.Когда вы получите координаты мыши по событию мыши, найдите их на карте пикселей.Найденный вами цвет может указывать на объект, на котором в данный момент находится мышь.

Возможно, будет более эффективно использовать буфер трафарета, но считывание буфера трафарета в память не представляется возможным в OpenGL ES.С другой стороны, преимущество этого метода в том, что вы не ограничены 255 объектами, как в случае 8-битного буфера трафарета.

...