2013-12-20 2 views
0

Solved: Оказывается, я проходил в OpenGL с именем текстуры в шейдер вместо активного числа текстур, установил его с:Android OpenGL ES 2.0 - черный текстуры на некоторых устройствах

GLES20.glUniform1i(sTextureHandle, 0); // 0 means GLES20.GL_TEXTURE0 

UPDATE : glGetError() возвращает 0, после вызова glTexImage2D(). Таким образом, нет ошибок, отмеченных OpenGL ...

Я работаю над игрой с использованием OpenGL 2.0 для рендеринга.

Я тестировал его на своем Galaxy Nexus и не имел никаких текстурных ошибок. Все мои текстуры имеют степень 2, в формате .png и хранятся в папке No -DPI. Все текстуры загружаются и визуализируются с использованием или без использования альфа.

Я пробовал игру на Samsung Galaxy S4 и Droid Bionic, оба из которых привели к черным текстурам (с альфа-смешиванием и без него).

Я пробовал интернет для людей с одинаковой проблемой, но все их исправления уже отражены в моем коде.

Я думаю, что это должно быть что-то с тем, как я создаю текстуру или мою настройку OpenGL, потому что иначе она будет работать только на Galaxy Nexus?

OpenGL установки:

GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); //Black Background 
GLES20.glClearDepthf(1.0f);      //Depth Buffer Setup 
GLES20.glEnable(GLES20.GL_DEPTH_TEST);   //Enables Depth Testing 
GLES20.glDepthFunc(GLES20.GL_LEQUAL);   //The Type Of Depth Testing To Do 
GLES20.glDisable(GLES20.GL_BLEND); 
Matrix.orthoM(sProjectionMatrix, 0, 0.0f, width, height, 0.0f, 0.0f, MAX_DEPTH); 
Matrix.setLookAtM(sViewMatrix, 0, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f); 

// Get the texturing handles 
GLES20.glBindAttribLocation(sShaderProgram, 2, "a_tex_coords"); 
sTexCoordsHandle = GLES20.glGetAttribLocation(sShaderProgram, "a_tex_coords"); 
sTextureHandle = GLES20.glGetUniformLocation(sShaderProgram, "u_texture"); 
GLES20.glUseProgram(sShaderProgram); 

GLES20.glEnableVertexAttribArray(sPositionHandle); 
GLES20.glEnableVertexAttribArray(sColorHandle); 
GLES20.glEnableVertexAttribArray(sTexCoordsHandle); 

Texture Загрузка Код:

Bitmap bitmap = BitmapFactory.decodeStream(sGame.CONTEXT.getResources().openRawResource(R.drawable.circle)); 

LAST_TEXTURE_INDEX++; 
GLES20.glGenTextures(1, Texture.IDS, LAST_TEXTURE_INDEX); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, IDS[LAST_TEXTURE_INDEX]); 
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_NEAREST); 
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
bitmap.recycle(); 

Другое Текстура Покушение (в замене из GLUtils.texImage2D и точечного рисунка):

int width = 128; 
int height = 128; 
ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(width * height * 3).order(ByteOrder.nativeOrder()); 

for (int y = 0; y < height; y++) 
{ 
    for (int x = 0; x < width; x++) 
    { 
     pixelBuffer.put((byte) 0x00); 
     pixelBuffer.put((byte) 0xFF); 
     pixelBuffer.put((byte) 0xFF); 
    } 
} 

pixelBuffer.position(0); 
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, width, height, 0, GLES20.GL_RGB, GLES20.GL_UNSIGNED_BYTE, pixelBuffer); 

Перед вынесением I позвоните им:

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, sTextureIndex); 
GLES20.glUniform1i(sTextureHandle, sTextureIndex); 

Vertex Shader:

attribute vec4 a_position; 
attribute vec4 a_color; 
attribute vec2 a_tex_coords; 
uniform mat4 u_model_view_projection; 
varying vec4 v_color; 
varying vec2 v_tex_coords; 

void main() { 
    v_color = a_color; 
    v_tex_coords = a_tex_coords; 
    gl_Position = u_model_view_projection * a_position; 
} 

Фрагмент Shader:

varying vec2 v_tex_coords; 
uniform sampler2D u_texture; 
void main() { 
    vec4 color = texture2D(u_texture, v_tex_coords); 
    gl_FragColor = color; 
} 

И ради решения ошибки, я отключил смешивание, потому что я знаю, что альфа часто может вызвать головную боль Aswell.

Оба типа текстурирования (использование изображения или использование пиксельных данных) работают на моем Galaxy Nexus, но не на S4. Я не знаю, нарушен ли мой код текстурирования или какой-либо другой параметр OpenGL, но я постараюсь опубликовать весь соответствующий код.

ответ

0

Оказывается, я проходил по OpenGL с именем текстуры в шейдер вместо активного количества текстур, установил его с:

GLES20.glUniform1i(sTextureHandle, 0); // 0 means GLES20.GL_TEXTURE0 

вместо:

GLES20.glUniform1i(sTextureHandle, sTextureIndex); // sTextureIndex = generated texture ID