glBuffer работает с одним стилем данных, но не с другим. Почему? - PullRequest
1 голос
/ 10 июля 2019

Я работаю над некоторыми учебными примерами OpenGL и модифицирую их для достижения целей моих проектов.

Проблема в том, что программа работает с этой конструкцией данных (то есть рисует треугольник)

    float firstTriangle[] = {
        -0.9f, -0.5f, 0.0f,  // left
        -0.0f, -0.5f, 0.0f,  // right
        -0.45f, 0.5f, 0.0f,  // top
    };

    glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);

но он не рисует треугольник, когда я делаю следующие изменения:

    std::vector<float> thisslice;
    thisslice.push_back((float) -0.9f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) -0.45f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);

    glBufferData(GL_ARRAY_BUFFER, thisslice.size() * sizeof(float), &thisslice[0], GL_STATIC_DRAW);

Что мне здесь не хватает?

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Код, представленный выше должен работать.Это не приятно, но должно работать.Это заставляет меня думать, что вы, возможно, сократили пример для публикации здесь?Возможные причины, по которым он может не работать:

  • Вектор пуст, и поэтому thisslice [0] является попыткой разыменования NULL, и создается исключение (именно поэтому, как упоминалось выше, вы должны использовать .data () вместо этого.Это обычно , однако, происходит только в режиме отладки.
  • Вектор в вашем фактическом коде является const ref, что означает, что thisslice [0] возвращает float (а не float &).Взятие адреса просто дает вам адрес какого-то временного объекта, а не данных в векторе.

В качестве примечания, повторный вызов push_back является ужасным способом инициализации std :: vector,Выделите размер заранее и используйте оператор [] для назначения элементов.В качестве альтернативы используйте список инициализатора, присваивание или ctor, который принимает начало и конец.

В качестве еще одного примечания, почему вы бросаете float в float при каждом вызове push_back?

1 голос
/ 10 июля 2019

Вы использовали -0.5f вместо 0.5f в качестве координаты y для третьей вершины, поэтому все три вершины находятся на прямой линии, и треугольник вообще не покрывает область.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...