I'm working on a simple 3d game using the Processing Java environment. I want to optimise my code so I can draw many many 'objects' (the world is made up of many different shaped objects that live inside the volume of a cube) without the framerate dropping. How can I detect which faces cannot be seen and stop drawing them? I have tried this code:
pgl = (PJOGL) beginPGL();
gl = pgl.gl.getGL2ES2();
gl.glEnable(GL.GL_CULL_FACE);
gl.glCullFace(GL.GL_BACK);
which does do backface culling but it is not all that I want. I want to stop rendering any face that the camera cannot see, i.e. inside faces etc.
The code used to draw the objects (just a simple cube for testing) is as follows:
noFill();
noStroke();
noSmooth();
push();
lights();
translate(this.x * this.size, this.y * this.size, this.z * this.size);
beginShape(QUADS);
texture(this.texture_image);
vertex(-this.size / 2, -this.size / 2, this.size / 2, 0, 0);
vertex( this.size / 2, -this.size / 2, this.size / 2, this.size / 2, 0);
vertex( this.size / 2, this.size / 2, this.size / 2, this.size / 2, this.size / 2);
vertex(-this.size / 2, this.size / 2, this.size / 2, 0, this.size / 2);
// -Z "back" face
vertex( this.size / 2, -this.size / 2, -this.size / 2, 0, 0);
vertex(-this.size / 2, -this.size / 2, -this.size / 2, this.size / 2, 0);
vertex(-this.size / 2, this.size / 2, -this.size / 2, this.size / 2, this.size / 2);
vertex( this.size / 2, this.size / 2, -this.size / 2, 0, this.size / 2);
// +Y "bottom" face
vertex(-this.size / 2, this.size / 2, this.size / 2, 0, 0);
vertex( this.size / 2, this.size / 2, this.size / 2, this.size / 2, 0);
vertex( this.size / 2, this.size / 2, -this.size / 2, this.size / 2, this.size / 2);
vertex(-this.size / 2, this.size / 2, -this.size / 2, 0, this.size / 2);
// -Y "top" face
vertex(-this.size / 2, -this.size / 2, -this.size / 2, 0, 0);
vertex( this.size / 2, -this.size / 2, -this.size / 2, this.size / 2, 0);
vertex( this.size / 2, -this.size / 2, this.size / 2, this.size / 2, this.size / 2);
vertex(-this.size / 2, -this.size / 2, this.size / 2, 0, this.size / 2);
// +X "right" face
vertex( this.size / 2, -this.size / 2, this.size / 2, 0, 0);
vertex( this.size / 2, -this.size / 2, -this.size / 2, this.size / 2, 0);
vertex( this.size / 2, this.size / 2, -this.size / 2, this.size / 2, this.size / 2);
vertex( this.size / 2, this.size / 2, this.size / 2, 0, this.size / 2);
// -X "left" face
vertex(-this.size / 2, -this.size / 2, -this.size / 2, 0, 0);
vertex(-this.size / 2, -this.size / 2, this.size / 2, this.size / 2, 0);
vertex(-this.size / 2, this.size / 2, this.size / 2, this.size / 2, this.size / 2);
vertex(-this.size / 2, this.size / 2, -this.size / 2, 0, this.size / 2);
endShape();
pop();
Sorry for the long code.
Thanks in advance.