2011-12-27 2 views
0

Я реализовал возможность для нескольких текстур пока, хотя сейчас ... но вчера я узнал, что они не будут работать так, как ожидалось, на других устройствах ... не мои ..:/ На моем устройстве (Experia Mini Pro) она работает идеально:Несколько текстур не будут работать на другом устройстве?

Первые несколько кодовых фрагментов для загрузки текстуры:

int[] textureID = new int[1];   
GLES20.glDeleteTextures(1,textureID,0); 
GLES20.glGenTextures(1,textureID,0); 
this.unit = textureID[0]; 
GLES20.glActiveTexture(GLES20.GL_TEXTURE0+this.unit); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,this.unit);  
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR); 
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); 

... 
... bitmap loading functions 
... 

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0,bitmapTexture,0);  
bitmapTexture.recycle(); 

и здесь ту часть, где нарисованы мои треугольники:

GLES20.glUniform1i(LLShader.location[20],gfx.imagetexture.unit); 
GLES20.glActiveTexture(GLES20.GL_TEXTURE0+gfx.imagetexture.unit); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,gfx.imagetexture.unit); 
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,gfx._vertexBuffer.capacity()/3); 

на ут устройства все работает достаточно совершенным: Th это четыре квадроцикла, каждый из которых имеет свою собственную текстуру, которая рисуется одна за другой.

Но тогда я дал apk моему другу и на его устройстве (Samsung Galaxy S1), кажется, что он загружает только одну текстуру и отображает только первый из них ... Не знаю, где искать .... Я еще не нашел ошибку.

PS: Произошла ошибка, которую я не знаю, чтобы справиться. После «повторного открытия» (переход от режима сна) текущее приложение, все изображения, которые должны использовать альфа-смешивание, являются черными ... что может быть проблемой?

ответ

4

Это очень похоже на другой случай, который я работал всего несколько часов назад.

В OpenGL ES 2.0 в случае отсутствия мощности из 2 текстур режим обертывания может быть только GL_CLAMP_TO_EDGE.

Это означает, что если вы используете режим обертывания, отличный от GL_CLAMP_TO_EDGE, он ожидает иметь 2 текстуры. (например, 512X256, 1024X1024 и т. д.).

Интерпретация этого правила довольно открыта и сильно меняется в зависимости от устройства, например, на моей Motorola Defy он работает, на Galaxy TAB это не так, это может оправдать поведение, которое вы испытываете.

Попробуйте это:

20.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);

Надеюсь, он будет делать магию.

Маурицио Бенедетти

0

Извините за пусть вы ждете первых:/

Я масштабироваться каждую текстуру до размера текстуры pow2, глядя вверх, когда новый pow2-фактура является достаточно большой, чтобы содержать исходный точечный рисунок , Когда я изменить TextureParameterf к GL_CLAMP ... это выглядит следующим образом: it seems that one part of the texture-coordinates is not passed right

кажется, что одна часть текстурных координат не передается право

Я надеюсь, вы знаете, почему это выглядит немного теперь странно.

EDIT: Наконец, я узнал, в чем была моя неудача. V-координата не была рассчитана правильно. Теперь, поскольку все v-координаты положительны, он отлично работает, спасибо :)

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