Android OpenGL2.0 montrant des textures noires

J'essaie de dessiner des textures sur quads dans OpenGL2.0. Jusqu'à présent, j'ai eu les quads pour apparaître et tout, mais les textures ne sont pas là – les quads sont tous noirs.

Mon principal soupçon est que je ne mappe pas correctement les textures – mes textures ne sont pas des puissances de 2, ni elles sont carrées – leur largeur est dans le domaine mWidth et leur hauteur dans mRowHeight.

Les quads sont dessinés dans une liste verticale, qui se fait avec une matrice de traduction.

Je serais très reconnaissant si quelqu'un peut se passer de cette cause, je suis désespéré!

Voici le code associé:

Initialisation des tampons:

void initBuffers() { float r = (float) mRowHeight / (mHeight / 2f); ByteBuffer bb; float[] bounds = { // XYZ /* 0 - TL */-1f, 1f, 0f, /* 1 - BL */-1f, 1 - r, 0f, /* 2 - BR */ 1f, 1 - r, 0f, /* 3 - TR */ 1f, 1f, 0f }; bb = ByteBuffer.allocateDirect(bounds.length * 4); bb.order(ByteOrder.nativeOrder()); mVertBuffer = bb.asFloatBuffer(); mVertBuffer.put(bounds).position(0); short[] indices = { 0, 1, 2, 0, 2, 3 }; bb = ByteBuffer.allocateDirect(indices.length * 2); bb.order(ByteOrder.nativeOrder()); mIndBuffer = bb.asShortBuffer(); mIndBuffer.put(indices).position(0); float[] texture = { /* 0 - BL */-1f, 1f, /* 1 - TL */-1f, 1 - r, /* 2 - BR */1f, 1 - r, /* 3 - TR */1f, 1f }; bb = ByteBuffer.allocateDirect(texture.length * 4); bb.order(ByteOrder.nativeOrder()); mTexBuffer = bb.asFloatBuffer(); mTexBuffer.put(texture).position(0); } 

Dessiner le cadre:

  @Override public void drawFrame() { long startTime = System.currentTimeMillis(); if (!mLayoutComplete) { return; } final float halfw = mHeight / 2f; final int rowHeight = mRowHeight; final float r = (float) rowHeight / halfw; int i = mFirstRow; final float initial = (float) ((i * rowHeight) - mScroll) / halfw; Matrix.setIdentityM(mTMatrix, 0); Matrix.translateM(mTMatrix, 0, 0, -initial, 0); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 0, mVertBuffer); GLES20.glEnableVertexAttribArray(maPositionHandle); final int l = mLastRow; for (; i <= l; i++) { ThumbRow thr = mCache.get(i); if (thr != null) { GLES20.glActiveTexture(GLES20.GL_TEXTURE0); if (thr.mDirty) { thr.loadTexture(null, null); thr.mDirty = false; } else { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, thr.mRow + 1); } GLES20.glUniform1i(msTextureHandle, 0); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 0, mTexBuffer); GLES20.glEnableVertexAttribArray(maTextureHandle); GLES20.glUniformMatrix4fv(muTMatrixHandle, 1, false, mTMatrix, 0); GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, mIndBuffer); Log.i(TAG, GLES20.glGetProgramInfoLog(mProgram)); } Matrix.translateM(mTMatrix, 0, 0, -r, 0); // Shift drawing // window to next // row. } GLES20.glDisableVertexAttribArray(maPositionHandle); GLES20.glDisableVertexAttribArray(maTextureHandle); Log.d(TAG, "onDrawFrame(): " + (System.currentTimeMillis() - startTime)); } 

Chargement des textures:

  public void loadTexture(GL10 gl, Context c) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mRow + 1); // Create Nearest Filtered Texture 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); // Different possible texture parameters, eg // GLES20.GL_CLAMP_TO_EDGE GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); Bitmap bitmap = mBitmap; if (bitmap == null) { bitmap = mEmptyBitmap; } GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); } 

Vertex Shader:

 uniform mat4 uTMatrix; uniform mat4 uMVPMatrix; attribute vec4 aPosition; attribute vec2 aTextureCoord; varying vec2 vTextureCoord; void main() { gl_Position = uMVPMatrix * uTMatrix * aPosition; vTextureCoord = aTextureCoord; } 

Fragment Shader:

 precision mediump float; varying vec2 vTextureCoord; uniform sampler2D sTexture; void main() { gl_FragColor = texture2D(sTexture, vTextureCoord); } 

Toute aide sera très appréciée.

  • Les textures alpha Android / opengles non semi-transparentes mais binaires transparentes
  • Comment créer une texture OpenGL à partir d'un tableau d'octets dans Android
  • Comment charger des textures dans OpenGL ES efficacement
  • Opengl arrière-plan transparent et l'aperçu de la caméra n'aiment pas le texte
  • Mappage d'une texture sur un carré: Pourquoi l'image est-elle tournée?
  • Android Opengl-es chargé d'une non-puissance de 2 texture
  • Bitmap trop grand pour être téléchargé dans une texture
  • Comment enregistrer le bitmap à partir de GLSurfaceView (uniquement bitmap, pas toute la texture)
  • One Solution collect form web for “Android OpenGL2.0 montrant des textures noires”

    Il s'agit d'un problème assez courant de la texturation sur OpenGL ES 2.0 qui m'a causé beaucoup de mal de tête dans le passé.

    Dans OpenGL ES 2.0, dans le cas de la non-puissance de 2 textures, le mode enveloppement ne peut être que GL_CLAMP_TO_EDGE.

    Il existe également des restrictions sur le filtre que vous pouvez utiliser, qui peut être uniquement GL_NEAREST ou GL_LINEAR (autrement dit, aucun MIPMAPPING)

    En mots simples, en vérifiant la fonction loadtexture, changez ces 2 lignes de code de:

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

    à

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

    J'espère que cela corrige le problème, laissez-moi savoir 🙂

    Maurizio Benedetti

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.