Android OpenGL2.0 shows black textures

I am trying to draw quads textures in OpenGL2.0. So far, I got ATVs and that's it, but there are no textures there - all four-legged.

My main suspicion is that I do not paint textures correctly - my textures do not matter 2, as well as the square . Their width is in the mWidth field and their height in mRowHeight.

Squares are drawn in a vertical list, which is performed using a translation matrix.

I would be very grateful if anyone can solve this problem, I am in despair!

Here's the corresponding code:

Buffer Initialization:

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

Frame Drawing:

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

Texture loading:

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

Any help would be greatly appreciated.

+7
source share
1 answer

This is a fairly common texturing problem in OpenGL ES 2.0, which in the past caused me a big headache.

In OpenGL ES 2.0 in caso without a 2-texture power, the wrapping mode can only be GL_CLAMP_TO_EDGE.

There are also restrictions on the filter you can use, which can only be GL_NEAREST or GL_LINEAR (in other words, MIPMAPPING)

In simple words, checking the loadtexture function, change these 2 lines of code to:

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

to

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

I hope this fixes the problem let me know :)

Maurizio Benedetti

+20
source

All Articles