Мой ноутбук использует графику Intel(R) UHD Graphics с общей памятью, но я не думаю, что это проблема. потому что я тестировал его на своем стационарном ПК с RTX 3060 и получил те же результаты.
Вот мои функции:
Код: Выделить всё
void Mesh::LinkAttrib(GLuint layout, GLuint numComponents, GLenum type, GLsizeiptr stride, void* offset, bool integer)
{
if (integer) glVertexAttribIPointer(layout, numComponents, type, stride, offset);
else glVertexAttribPointer(layout, numComponents, type, GL_FALSE, stride, offset);
glEnableVertexAttribArray(layout);
}
Mesh::~Mesh()
{
// If nIndices is less than 0, we know that we have not uploaded any arrays.
if (nIndices < 0) return;
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
}
void Mesh::UploadData()
{
// Delete previous data
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
// Generate new arrays
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW);
LinkAttrib(0, 3, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)(0 * sizeof(glm::u8)), true);
LinkAttrib(1, 1, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)(3 * sizeof(glm::u8)), true);
LinkAttrib(2, 2, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)(4 * sizeof(glm::u8)), true);
LinkAttrib(3, 1, GL_UNSIGNED_SHORT, sizeof(Vertex), (void*)(6 * sizeof(glm::u8)), true);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
nIndices = indices.size();
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-memory