2012-01-30 9 views
4

Используя Android OpenGL ES 1.1 (HTC Desire) ...Android OpenGL ES 1.1: Чтение из буфера трафарета

У меня есть проблема в целом заключается в следующем:

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

Так что я пришел с идеей ...

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

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

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

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

ответ

1

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

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

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

+0

Возможно, стоит отметить, что вышеупомянутый подход требует некоторой утонченности, поскольку по умолчанию для 8-битных значений цвета не поддерживается поддержка текстур вложений renderbuffer (значения glReadPixel следует соответствующим образом масштабировать). Другие подводные камни могут включать в себя: сглаживание glEnabled и (но это дикая гипотеза), возможно, некоторые причуды реализации от поставщиков оборудования (например, некоторые видеооборудование может быть не столь точным во время растеризации). Немного поздно, но кто-то еще может найти ответ так, как я. – Rick77