Для каждого куба код может выглядеть примерно так:
public class Cube {
private final int programObject;
private final int colorLink;
private final float[] color;
Cube() {
... // link program
// reference on the uniform in shader
colorLink = GLES20.glGetUniformLocation(this.programObject, "vColor");
}
public void draw() {
...
if (lEDIsGreen) { // change color
color = green();
} else {
color = blue();
}
GLES20.glUniform4fv(colorLink, 1, color, 0);
... // draw object
}
private static float[] green() {
return new float[] {
Color.red(Color.GREEN) / 255f,
Color.green(Color.GREEN) / 255f,
Color.blue(Color.GREEN) / 255f,
1.0f};
...
}
}
Класс рендеринга:
public class Render implements GLSurfaceView.Renderer {
private Cube[] cubes = new Cube[NUMBER_CUBES];
...
public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
for (int i = 0; i < NUMBER_CUBES; i++) cubes[i] = new Cube(); // create cubes
...
}
public void onDrawFrame(GL10 glUnused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
GLES20.glEnable(GLES20.GL_CULL_FACE);
GLES20.glCullFace(GLES20.GL_BACK);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
for (Cube cube: cubes) cube.draw(); // draw all cubes
}
}
Шейдеры могут выглядеть примерно так:
// vertex shader
#version 100
precision lowp float;
uniform mat4 u_mvpMatrix;
attribute vec4 a_position;
void main() {
gl_Position = u_mvpMatrix * a_position;
}
// fragment shader
#version 100
precision lowp float;
uniform vec4 vColor; // color is transmitted here
void main() {
gl_FragColor = vColor;
}