Связывание нескольких буферных объектов с одним объектом массива вершин не работает
Я пытаюсь понять соответствие между точками привязки буфера вершин OpenGL и индексами массивов вершин. У меня есть 2D-прямоугольник и 2D-треугольник
const GLfloat rect[] = {
-0.5f, 0.5f,
0.5f, 0.5f,
0.5f, -0.5f,
-0.5f, -0.5f};
const GLfloat tri[] = {
0.0f, 1.0f,
0.5f, 0.5f,
-0.5f, 0.5f};
Я помещаю их в разные объекты буфера вершин и пытаюсь сопоставить их с индексами объекта массива вершин, чтобы первые 3 атрибута были из треугольника, а следующие 2 - из последних 2 точек прямоугольника. Затем я рисую их в виде треугольных полос.
GLuint vbo[2];
glGenBuffers(2, vbo);
GLuint varr;
glGenVertexArrays(1, &varr);
glBindVertexArray(varr);
// draw triangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(tri), tri, 0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
// draw rectangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(rect), rect, 0);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
glEnableVertexAttribArray(3);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
glDeleteVertexArrays(1, &varr);
glDeleteBuffers(2, vbo);
Как вы можете видеть из координат, предполагаемая форма похожа на хижину, соседний треугольник над прямоугольником. Тем не менее, что я получаю, это
Я неправильно понимаю привязку или индексы объекта массива вершин? Полный скомпилированный код здесь, я использую GtkGlExt, но часть OpenGL является общей.
2 ответа
Я думаю, что вы делаете концептуальную ошибку о том, что атрибут.
Насколько я понимаю, вы пытаетесь нарисовать треугольную полосу, используя 5 вершин, 3 из которых идут от треугольника, а 2 - от прямоугольника.
Однако атрибуты являются частями вершины, то есть положением, цветом и т. Д. Привязки буфера атрибутов вершин используются для набора атрибутов всех вершин. Т.е. вы можете поместить позиции всех вершин в буфер 1 и цвета всех вершин в буфер 2.
Вы не можете поместить положение и цвет первых нескольких вершин в одном буфере, а также положение и цвет других вершин в другом буфере и по-прежнему рисовать их за один вызов.
Решение состоит в объединении буферов (или, точнее, буфера треугольника и последней части буфера прямоугольника) в один буфер или разделении вызова отрисовки на несколько вызовов отрисовки.
Как насчет того, что в коде шейдера объявлено как "in", это атрибут? Рабочее определение больше, чем концептуальное.