refactor to use a VAO