Я пытаюсь выполнить выбор 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).
Это ограничение платформы или это я не правильно делаю?(Я не нашел никакого реального примера чтения буфера трафарета)
Также, кто-нибудь может предложить, если есть какой-либо метод, кроме использования буфера трафарета, для определения идентификатора объекта, на котором пользователь щелкает?