using gl buffer objects. may fail horribly