Android OpenGL текстуры / обнаружение объектов - PullRequest
0 голосов
/ 20 мая 2011

Я пытаюсь выполнить выбор OpenGL (т.е. ответить на вопрос «на каком объекте щелкнул пользователь?»).Я гуглил его и нашел несколько разных техник, но ни один из них не подходит для меня

  • проверка цвета пикселя с помощью glReadPixels: я использую текстуры, поэтому он не подходит
  • проверка пикселяальфа с glReadPixels: я использую альфа для смешивания, поэтому он не подходит
  • для построения луча и проверки коллизий: ой! Я бы предпочел не вдаваться в это ...
  • glRenderMode(GL_SELECT): не поддерживается в OpenGL ES

Я думал о проверке значения буфера трафарета.Я не использую его по назначению, поэтому каждый из моих объектов может записать в него свой идентификатор (у меня менее 255 объектов).Проблема в том, что мне не удается прочитать значение буфера трафарета, используя glReadPixels.Нет проблем для RGBA, но мне не удается заставить его работать на значение трафарета.Вот мой код:

ByteBuffer bb = ByteBuffer.allocateDirect(4); 
bb.order(ByteOrder.nativeOrder()); 
bb.position(0); 
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, bb); 
Log.d(TAG, "color is R"+ bb.get() + " G" + bb.get() + " B" + 
    bb.get() + " A" + bb.get()); 
// ---> This is working fine, I can read RGBA correctly 
bb.position(0); 
glReadPixels(x, y, 1, 1, GL11ExtensionPack.GL_STENCIL_INDEX, 
GL_UNSIGNED_BYTE, bb); 
    Log.d(TAG, "stencil is "+ bb.get()); 
    // ---> This is not working, looks like it isn't doing anything 

, так как я все еще получаю значение R в буфере ...

Я уверен, что буфер трафарета запущен и работает, потому что мне удалось его использоватьдля некоторого отсечения.Он настроен на 8 бит с использованием setEGLConfigChooser (8, 8, 8, 8, 8, 8).

Это ограничение платформы или это я не правильно делаю?(Я не нашел никакого реального примера чтения буфера трафарета)

Также, кто-нибудь может предложить, если есть какой-либо метод, кроме использования буфера трафарета, для определения идентификатора объекта, на котором пользователь щелкает?

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

На самом деле бросание луча в сцену и проверка на наличие столкновений является методом выбора для выбора.

Если вы хотите использовать подход glReadPixels, вы можете просто визуализировать ваши объекты в задний буфер (с помощьюидентификатор объекта, закодированный как постоянный цвет) без замены буферов.Вы все еще можете визуализировать ваши объекты полностью текстурированными для отображения.Вы отображаете их только с цветом объекта, когда пользователь щелкнул (и сцена фактически изменилась), и только в задний буфер без их отображения.

0 голосов
/ 15 июня 2013

проверка цвета пикселя с помощью glReadPixels: я использую текстуры, поэтому он не подходит

Почему это не работает? Вы можете использовать glReadPixels для считывания цвета SurfaceTexture пикселей независимо от того, является ли источник медиа-данных камерой или видеофайлом.

Ознакомьтесь с проектом MediaDump , в котором при попытке выгрузить каждый видеокадр в отдельные файлы изображений с помощью GLSurfaceView вы можете изменить его для дальнейшей обработки или изменить источник на камеру, оба варианта работоспособны. Но обратите внимание на настройку размеров RGBA в setEGLConfigChooser , это повлияет на скорость чтения пикселей .

...