GLSurfaceView отображает черный цвет на Nexus 7 с Android 4.2

У меня есть приложение OpenGL ES2.0, которое работает на устройствах с различными версиями Android от 2.2 до 4.1. Однако мне сказали, что при запуске на Nexus 7 с Android 4.2 3D-графика в приложении полностью черная. Однако панель действий и диалоги работают нормально. Я попробовал это на эмулированном Nexus 7 с процессором Intel Atom, HAX и GPU с поддержкой 4.2.2, и это работает нормально. Я бы предпочел запустить образ ARM, но он, похоже, не включает Open GL ES2.0.

Кто-нибудь знает, что может быть причиной этой проблемы на Nexus 7 и как ее обойти?

Одна из возможностей заключается в том, что в текущей версии приложения целевой уровень API установлен на 15, а 4.2.2 — на уровень 17. Может ли это быть проблемой? Хотя на эмуляторе работает нормально.

Ниже приведен код, который я использую для установки текстур в рендерере onSurfaceCreated() на случай, если это поможет.

/**
 * Sets up texturing for the object
 */
private void setupTextures(String[] texFiles) {
    // create new texture ids if object has them
    // number of textures
    mTextureIDs = new int[texFiles.length];

    GLES20.glGenTextures(texFiles.length, mTextureIDs, 0);

    for(int i = 0; i < texFiles.length; i++) {
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIDs[i]);

        // parameters
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                GLES20.GL_NEAREST);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
                GLES20.GL_TEXTURE_MAG_FILTER,
                GLES20.GL_LINEAR);

        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
                GLES20.GL_REPEAT);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
                GLES20.GL_REPEAT);

        int ID = mContext.getResources().getIdentifier( texFiles[i], "raw", "com.antonymsoft.slidixcube" );
        InputStream is = mContext.getResources().openRawResource(ID);
        Bitmap bitmap;
        try {
            bitmap = BitmapFactory.decodeStream(is);
        } finally {
            try {
                is.close();
            } catch(IOException e) {
                // Ignore.
            }
        }

        // create it 
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();

    }
}

person tonyw    schedule 14.04.2013    source источник
comment
Если поверхность полностью черная, я бы подумал, что проблема более фундаментальна, чем загрузка текстуры. Какой у вас режим рендеринга? Как вы настраиваете свой контекст GL?   -  person Reuben Scratton    schedule 15.04.2013
comment
@ReubenScratton Спасибо за ваш ответ! Следующие строки устанавливают мой контекст и режим рендеринга из конструктора моего класса, производного от GLSurfaceView. ` // Создаем контекст OpenGL ES 2.0. setEGLContextClientVersion(2); // Установить рендерер для рисования на GLSurfaceView mCubeSize = 2; mCubeRenderer = новый CubeRenderer(контекст); setRenderer(mCubeRenderer); // Визуализация вида только при изменении данных рисования setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); `   -  person tonyw    schedule 16.04.2013
comment
Да, еще я забыл сказать, что я создаю экземпляр своего подкласса GLSurfaceView, используя макет XML, а затем использую findViewById() для получения ссылки.   -  person tonyw    schedule 16.04.2013
comment
Извините, здесь нет реальной идеи. Ваши растровые изображения текстур имеют степень двойки? Можете ли вы опубликовать больше кода?   -  person Reuben Scratton    schedule 16.04.2013
comment
Мои текстуры не являются степенью двойки. Это все еще важно — даже на OpenGL ES 2 и таком новом устройстве, как Nexus 7? Это мое первое знакомство с OpenGL и графическими процессорами, поэтому я очень открыт для советов по этому поводу. Что касается публикации большего количества кода, мне нужно подумать о том, что разместить, чтобы я не добавлял в сообщение много неуместного материала.   -  person tonyw    schedule 18.04.2013
comment
Я бы не стал доверять растровым изображениям, отличным от степени двойки, работать как текстуры. Какого размера ваши растровые изображения? Можете ли вы записать значение glGetError() после вызова texImage2D()?   -  person Reuben Scratton    schedule 18.04.2013


Ответы (1)


Какой у вас размер текстур? Это должно быть степень двойки, например 16x32 512x512 1024x512 и так далее.

person alexanoid    schedule 18.04.2013
comment
Да, это было так. Удивительно, но некоторые устройства до сих пор не поддерживают несилу двух текстур. - person tonyw; 25.05.2013