Проблемы с glReadPixels в Android - PullRequest
1 голос
/ 23 апреля 2011

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

Я не могу заставить glReadPixels работать правильно. Всегда возвращает 0 0 0 для значений пикселей. Я был бы очень признателен за любую помощь в получении правильных значений пикселей из него. спасибо

вот соответствующий код

private void handleEvent(MotionEvent event) {
    int x = (int) event.getX();
    int y = (int) event.getY();
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    if (actionCode == 0) {
        // Paint with colorID color
        mSettings.picking(true);
        dumpEvent(event);
        final GL10 gl = mSettings.getGL();

        ByteBuffer PixelBuffer = ByteBuffer.allocateDirect(4);
        PixelBuffer.order(ByteOrder.nativeOrder());
        gl. glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1);
        gl.glReadPixels(x, y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, PixelBuffer);
        byte b[] = new byte[4];
        PixelBuffer.get(b);
        String key = "" + b[0] + b[1] + b[2];       
        // Check for selection
        mRenderer.processSelection(event, new SGColorI(pixel[0], pixel[1], pixel[2], pixel[3]));

        log.pl("GL on touchdown", key);
    } else if (actionCode == 2) {
        mSettings.picking(false);
    }
}

Ответы [ 2 ]

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

allocateDirect "просто не работает" в этом случае.Использовать allocate.

Мне это показалось очень странным, но единственное отличие, к которому я пришел - это выделить vs allocateDirect.

Также этот пост в группах Google Мне очень помогло.

Кстати, это открытие было сделано на эмуляторе (несколько разных версий), а не на реальном устройстве.

0 голосов
/ 13 ноября 2013

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

...