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);
Texture loading:
public void loadTexture(GL10 gl, Context c) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mRow + 1);
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.