void opengl_bind_vertex_array(const vertex_layout& layout) { auto iter = Stored_vertex_arrays.find(layout); if (iter != Stored_vertex_arrays.end()) { // Found existing vertex array! GL_state.BindVertexArray(iter->second); return; } GR_DEBUG_SCOPE("Create Vertex array"); GLuint vao; glGenVertexArrays(1, &vao); GL_state.BindVertexArray(vao); for (size_t i = 0; i < layout.get_num_vertex_components(); ++i) { auto component = layout.get_vertex_component(i); auto& bind_info = GL_array_binding_data[component->format_type]; auto& attrib_info = GL_vertex_attrib_info[bind_info.attribute_id]; auto attribIndex = attrib_info.attribute_id; glEnableVertexAttribArray(attribIndex); glVertexAttribFormat(attribIndex, bind_info.size, bind_info.data_type, bind_info.normalized, static_cast<GLuint>(component->offset)); // Currently, all vertex data comes from one buffer. glVertexAttribBinding(attribIndex, 0); } Stored_vertex_arrays.insert(std::make_pair(layout, vao)); }