I have the following problem in OpenGL ES3 concerning instancing
I draw 64 shapes in one drawcall - triangles. OK!
Then I want to give the shapes individual eyes and they are "blinking". The blinking means different offsets in the atlas (i.e. differents uv-coords). I could easily make one drawcall for all shapes with the same eye-state but if I want the shapes to be in different blinking-modes - how could I acomplish it with instancing. The method-signature does not allow it
GLES30.glDrawArraysInstanced(GLES30.GL_TRIANGLES, (vertexOffset + bitmapIndex) * CreateGLContext.N_RECT_VERTS, CreateGLContext.N_RECT_VERTS, nShapes);
the vertexoffset is the position in the buffer and let say the first-eye has position 59. the next 60 and so on. Totally 7 eye-states and uv-coords
So I have 64 shapes and since I want them to have their own blinking-states which means differents offsets .. I do NOT know how I could acomplish it with just ONE draw call.
the draw-method in the class BlinkingEyes
@Override
public void draw() {
GLES30.glUseProgram(mProgramHandle);
GLES30.glEnableVertexAttribArray(mPositionHandle);
GLES30.glVertexAttribPointer(mPositionHandle, CreateGLContext.POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, CreateGLContext.STRIDE, 0);
GLES30.glEnableVertexAttribArray(mTextureCoordinateHandle);
GLES30.glVertexAttribPointer(mTextureCoordinateHandle, CreateGLContext.TEXTURE_COORDINATE_DATA_SIZE, GLES20.GL_FLOAT, false,
CreateGLContext.STRIDE, CreateGLContext.POSITION_DATA_SIZE * CreateGLContext.BYTES_PER_FLOAT);
setLargeMVPmatrix();
GLES30.glUniformMatrix4fv(mMVPMatrixHandle, nShapes, false, mMVPMatrixMajor, 0);
GLES30.glDrawArraysInstanced(GLES30.GL_TRIANGLES, (vertexOffset + bitmapIndex) * CreateGLContext.N_RECT_VERTS, CreateGLContext.N_RECT_VERTS, nShapes);
}
snippet from vertex-shader
uniform mat4 u_MVPMatrix[64];
in vec4 a_Position;
v_TexCoordinate = a_TexCoordinate;
gl_Position = u_MVPMatrix[gl_InstanceID] * a_Position;
snippet from fragment-shader
in vec2 v_TexCoordinate;
uniform sampler2D u_Texture;
fragmentColor = texture(u_Texture, v_TexCoordinate);
Is there a solution to this problem? Could I possibly send the information to the shader and tell it to use different uv-coords for different shapes?
the eyes (snippet from the atlas)