Bene, allora siamo un passo più avanti. La funzione glLoadName(id); andrà comunque caricarla nella tua funzione dove organizzi il rendering della scena OpenGL, più o meno così:

codice:
for(i = 0 ; i < nObj; i++)
{
	glPushMatrix();
		glTranslated(obj[i].pos.x, obj[i].pos.y, obj[i].pos.z);
		glPushName(obj[i].id);        // Nota A*
		obj[i].RenderObj(&obj[i]);  // Nota B*
		glPopName();
	glPopMatrix();
}
Nota A: Non confonderei l'indice dell'oggetto con il suo identificativo.
Nota B: Userei un puntatore a funzione per renderizzare l'oggetto (anche non necessario).

codice:
typedef struct
{
	GLdouble	x,y,z;	
} Posit;

typedef struct
{
	GLint	id;	
	Posit	pos;
	void	(*RenderObj)(GLint, void*);	// Rendering procedure.
} Obj;

Obj objects[nObj];
Nel codice di renderizzazione dell'oggetto inserirei la gestione della selezione:

codice:
void RenderSphere(void *pobj)
{
	if (pobj->id == selected) glColor3f(1.0, 1.0, 0.0);
	else glColor3f(0.2, 0.0, 0.8);
	auxSolidSphere(1.0);
}
Per assegnare la funzione di renderizzazione alla procedura, all'inizializzazione della vista:

obj[0].RenderObj = RenderSphere;

All'evento del mouse:

GLint selected;
selected = HitTest(pt.x, pt.y);


Fai alcune prove poi facci sapere ...