Автоматически сгенерированный буфер вершин и индексный буфер не работают - PullRequest
0 голосов
/ 23 февраля 2019

Короче говоря, я создал функцию в c ++ для создания массива буферов вершин и массива буферов индексов для меня на основе вектора вершин, т.е. если вы введете 4 точки в векторе вершин, функция теоретически должна вернуть 2 массивадля использования в буфере вершин и индексном буфере.Однако здесь возникает проблема.После того, как функция возвращает массивы, инициализированные буферы и вызывается glDrawElements, рисуется только один из 2 (для квадрата) треугольников, составляющих квадрат.Я очень запутался, почему.

Вот код,

Структура, определяющая материал, который возвращает функция:

struct ResultDataBuffer {
    std::vector<float> positions;
    std::vector<unsigned int> indices;
    unsigned int psize;
    unsigned int isize;
    unsigned int bpsize;
    unsigned int bisize;
};
//positions and indices are the vectors for the buffers (to be converted to arrays)
//psize and isize are the sizes of the vectors
//bpsize and bisize are the byte size of the vectors (i.e. sizeof())

Сама функция:

static ResultDataBuffer CalculateBuffers(std::vector<float> vertixes) {
    std::vector<float> positions = vertixes;
    std::vector<unsigned int> indices;
    int length = vertixes.size();
    int l = length / 2;
    int i = 0;
    while (i < l - 2) { //The logic for the index buffer array. If the length of the vertexes is l, this array(vector here) should be 0,1,2 , 0,2,3 ... 0,l-2,l-1
        i += 1;
        indices.push_back(0);
        indices.push_back(i + 1);
        indices.push_back(i + 2);
    }
    return{ vertixes,indices, positions.size(), indices.size(), sizeof(float)*positions.size(), sizeof(unsigned int)*indices.size() };

}

Код в основной функции (определения буферов и прочее):

    std::vector<float> vertixes = {
        -0.5f, -0.5f,
         0.5f, -0.5f,
         0.5f,  0.5f,
        -0.5f,  0.5f,
    };

    ResultDataBuffer rdb = CalculateBuffers(vertixes);
    float* positions = rdb.positions.data(); //Convert vector into array
    unsigned int* indices = rdb.indices.data(); //Ditto above

    unsigned int buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, rdb.bpsize, positions, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);

    unsigned int ibo;
    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, rdb.bisize, indices, GL_STATIC_DRAW);

Материал в основной функции (в игровом цикле):

glDrawElements(GL_TRIANGLES, rdb.isize, GL_UNSIGNED_INT, nullptr);

Извинения за длинуэтого поста я попытался сократить его.

Полный код C ++: https://pastebin.com/ZGLSQm3b

Код шейдера (находится в /res/shaders/Basic.shader): https://pastebin.com/C1ahVUD9

Таким образом, чтобы подвести итог, этот код, вместо рисования квадрата - 2 треугольника, рисует только один треугольник.

1 Ответ

0 голосов
/ 23 февраля 2019

Проблема вызвана циклом, который генерирует массив индексов:

while (i < l - 2) { 
    i += 1;
    indices.push_back(0);
    indices.push_back(i + 1);
    indices.push_back(i + 2);
}

Этот цикл генерирует индексы

0, 2,3, 0, 3, 4

Но вы должны сгенерировать индексы

0, 1, 2, 0, 2, 3

Это причина, потому что управляющая переменная увеличивается до того, как индексы добавляются к вектору.
Увеличивает управляющую переменную в конце цикла, чтобы решить проблему:

while (i < l - 2) { 
    indices.push_back(0);
    indices.push_back(i + 1);
    indices.push_back(i + 2);
    i += 1;
}

Или используйте for цикл:

for (unsigned int i = 0; i < l-2; ++ i)
{
    unsigned int t[]{ 0, i+1, i+2 };
    indices.insert(indices.end(), t, t+3);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...