1
votes

EDIT: Right, fixed it :D Issue was that I was trying to set the Projection matrix before calling glUseProgram()


I'm starting out with GL ES 2.0 on Android, and am trying to migrate some of my code over from 1.1 I've defined vertex and frag shaders as per the official docs, and after some googling I understand how the Model/Projection matrices work together, yet I can't seem to get anything but a blank screen.

I'm passing in a model view matrix to my vert shader, and am multiplying it with the ortho projection before multiplying the resulting mvp matrix with the vertex position. Here are my shaders to clarify:

Vertex Shader

attribute vec3 Position;
uniform mat4 Projection;
uniform mat4 ModelView;

void main() {
  mat4 mvp = Projection * ModelView;
  gl_Position = mvp * vec4(Position.xyz, 1);
}

Fragment Shader

precision mediump float;
uniform vec4 Color;

void main() {
  gl_FragColor = Color;
}

I'm building the projection matrix in my renderer's onSurfaceChangedFunction():

int projectionHandle = GLES20.glGetUniformLocation(shaderProg, "Projection");

Matrix.orthoM(projection, 0, -width / 2, width / 2, -height / 2, height / 2, -10, 10);
GLES20.glUniformMatrix4fv(projectionHandle, 1, false, projection, 0);

Then in my onDrawFrame(), I call each actor's draw routine, which looks like

nt positionHandle = GLES20.glGetAttribLocation(Renderer.getShaderProg(), "Position");
nt colorHandle = GLES20.glGetAttribLocation(Renderer.getShaderProg(), "Color");
nt modelHandle = GLES20.glGetUniformLocation(Renderer.getShaderProg(), "ModelView");

float[] modelView = new float[16];

Matrix.setIdentityM(modelView, 0);
Matrix.rotateM(modelView, 0, rotation, 0, 0, 1.0f);
Matrix.translateM(modelView, 0, position.x, position.y, 1.0f);

GLES20.glUniformMatrix4fv(modelHandle, 1, false, modelView, 0);
GLES20.glUniform4fv(colorHandle, 1, color.toFloatArray(), 0);

GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 0, vertBuffer);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
GLES20.glDisableVertexAttribArray(positionHandle);

I realize that I can optimize this a bit, but I just want to get it to work first. The vertices are in a FloatBuffer, and centered around the origin. Any thoughts on what I am doing wrong? I've been checking my code against various tutorials and SO questions/answers, and can't see what I'm doing wrong.

1
Please answer your own question if you fixed issuekeaukraine

1 Answers

0
votes

Right, fixed it :D Issue was that I was trying to set the Projection matrix before calling glUseProgram()