Well, you really can provide information about the triangle in the DrawElements call. Then you will need to provide the appropriate arrays (former COLOR_ARRAY, TEXTURE_COORD_ARRAY, etc., which are now commonly called VertexAttribArrays). This would probably be the easiest solution if you insist on a GPU.
However, as a rule, the way is to shoot the beam from the point of click into your scene. Therefore, you will not need to convert each triangle, but calculate the intersection test between the ray and your triangles. If the beam crosses, you hit it; if not, you did not. It can really be quite expensive if you make it brute force.
However, usually you will have your triangles contained in some spatial data structure (i.e. your scene graph will / may / should have several representations), for example, an octet (http://en.wikipedia.org/wiki/Octree) eg. This will provide a response to the collision in a number of tests. In addition, you can take into account the final size that the triangle will occupy on the screen (so it would be completely pointless to choose subpixel triangles in most cases).
And if you really want to get some fantasy, you can put the whole process on the GPU too (one example that sounds interesting, for example, http://blog.xeolabs.com/ray-picking-in-scenejs , but there will be more when using Google come.)
For me personally, the easiest way to implement the solution is b) Software Ray Picking, then a) and, finally, collecting the GPU. Start with the easiest, improve if you think this is not fast enough. Don’t get carried away with too high premature optimization (for example, collecting rays-rays works fine on my iPhone;). Have fun and good luck in your choice of algo.
source share