Я смущен тем, как заполнить массив вершин, чтобы он был правильно нарисован. Код OpenGL, который я использую:Как правильно заполнить массив вершин
float vertices[size];
//Here I have a method to populate the array with my values from a 2D matrix
glGenVertexArrays(1, &vaoID[0]); // Create our Vertex Array Object
glBindVertexArray(vaoID[0]); // Bind our Vertex Array Object so we can use it
glGenBuffers(1, vboID); // Generate our Vertex Buffer Object
glBindBuffer(GL_ARRAY_BUFFER, vboID[0]); // Bind our Vertex Buffer Object
glBufferData(GL_ARRAY_BUFFER, (size) * sizeof(GLfloat), vertices, GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer
glEnableVertexAttribArray(0); // Disable our Vertex Array Object
glBindVertexArray(0); // Disable our Vertex Buffer Object
glBindVertexArray(vaoID[0]); // Bind our Vertex Array Object
glDrawArrays(GL_TRIANGLES, 0, size/3); // Draw
glBindVertexArray(0); // Unbind our Vertex Array Object
Надеюсь, изображение станет легче понять. На изображении «A» матрица 3x3 слева показывает, что я сейчас получаю, когда рисую треугольники, а матрица справа - это то, чего я пытаюсь достичь.
В настоящее время, когда я создаю массив вершин для рисования, я заполняю его в порядке, показанном на изображении 'B'. Я добавляю значения в массив, когда я работаю по строке, а затем удаляю столбцы и повторяю. Так, например:
vertexArray[0] = matrixElement[0].x
vertexArray[1] = matrixElement[0].y
vertexArray[2] = matrixElement[0].z
vertexArray[3] = matrixElement[1].x
vertexArray[4] = matrixElement[1].y
vertexArray[5] = matrixElement[1].z
Этот порядок ввода в vertexArray дает результаты, которые можно увидеть в образе «C», где создаются неправильные треугольники.
Мой вопрос: какой разумный способ заполнения массива вершин в порядке, который будет создавать треугольники на большой матрице вершин таким образом, который выглядит как правая диаграмма в изображении «А».
Значительное дублирование данных? Есть ли способ сохранить вершины один раз, но ссылаться на них несколько раз? – Calco
@Calco: Конечно, используя 'GL_TRIANGLE_STRIP' и проиндексированную вершинную передачу через' glDrawElements() '. – genpfault
@Calco Да, есть такой способ, и таким образом это 'glDrawElements' и буферы массива элементов (также называемые буферами индексов или объектами буфера индексирования). – immibis