2011-12-24 2 views
1

У меня есть приложение для Android, которое использует немного OpenGL, работающего на Galaxy Nexus с ICS. После включения аппаратного ускорения и использования моей активности OpenGL некоторые из этих текстур украдены системой, а теперь в моих списках и других элементах пользовательского интерфейса. Как будто мои указатели GL, полученные с помощью GLES20.glGenTextures, на самом деле не являются новыми указателями, а скорее переписывают те, которые используются средством визуализации окон.Android - ICS - аппаратное ускорение крадет мои текстуры OpenGL

В любом случае должен быть какой-то брандмауэр или песочница между системой рисования экрана ОС и моим приложением, нет?

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

Скриншот (до/после)

Обычно повторяющийся точечный рисунок вытяжке, теперь изображение (от камеры в данном случае) я загружен в OpenGL в различной активности - http://a.yfrog.com/img532/9245/t81k.png

Gen/Load текстуры

int[] image = new int[1]; 
GLES20.glGenTextures(1, image, 0); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR); 
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0); 

Basic рисовать

GLES20.glViewport(0, 0, width, height); 
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
GLES20.glUseProgram(shader.program); 
GLES20.glUniform1i(GLES20.glGetUniformLocation(shader.program, "imageTexture"), 0); 
GLES20.glVertexAttribPointer(Attributes.VERTEX, 2, GLES20.GL_FLOAT, true, 0, squareVertices); 
GLES20.glEnableVertexAttribArray(Attributes.VERTEX); 
GLES20.glVertexAttribPointer(Attributes.TEXTUREPOSITON, 2, GLES20.GL_FLOAT, true, 0, textureVertices); 
GLES20.glEnableVertexAttribArray(Attributes.TEXTUREPOSITON); 
GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, image[0]); 
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
+0

Это звучит безумно. Можете ли вы разместить захват экрана и некоторый код? –

+1

Этот экранный захват выглядит безумным. Можете ли вы опубликовать свой код настройки контекста EGL? Возможно, вы каким-то образом наследуете переработанный контекст GL ... –

ответ

2

Оказывается, я вызывал команды GL в потоке пользовательского интерфейса в определенное время. Это помешало аппаратным ускоренным дисплеям приложений, предложенным Роменом Гаем на этом post.

Смежные вопросы