OpenGL рисует странные линии поверх полигонов - PullRequest
0 голосов
/ 10 июня 2018

Позвольте мне познакомить вас с Fishtank:

Это симулятор аквариума, которым я занимаюсь на OpenGL, чтобы выучить его перед тем, как отправиться в Вулкан.

Я нарисовал много таких рыб:

АквариумAquarium

Теперь я добавил функциональность сетки, которая выглядит следующим образом:

Сетка Grid

Но когдаНекоторое время я позволяю этому поворачиваться, появляются следующие строки:

Странные линии Weird Lines

Я видел где-то, чтобы очистить буфер глубины, что я и сделал,но это не решает проблему.

Вот код функции:

void Game::drawGrid()
{
    std::vector<glm::vec2> gridVertices;
    for (unsigned int x = 1; x < mGameMap.mColCount; x += 1) //Include the last one as the drawed line is the left of the column
    {
        gridVertices.push_back(glm::vec2(transformToNDC(mWindow, x*mGameMap.mCellSize, mGameMap.mCellSize)));
        gridVertices.push_back(glm::vec2(transformToNDC(mWindow, x*mGameMap.mCellSize, (mGameMap.mRowCount-1)*mGameMap.mCellSize)));
    }

    for (unsigned int y = 1; y < mGameMap.mRowCount; y += 1) //Same here but special info needed:
    // Normally, the origin is at the top-left corner and the y-axis points to the bottom. However, OpenGL's y-axis is reversed.
    // That's why taking into account the mRowCount-1 actually draws the very first line.
    {
        gridVertices.push_back(glm::vec2(transformToNDC(mWindow, mGameMap.mCellSize, y*mGameMap.mCellSize)));
        gridVertices.push_back(glm::vec2(transformToNDC(mWindow, (mGameMap.mColCount - 1)*mGameMap.mCellSize, y*mGameMap.mCellSize)));
    }

    mShader.setVec3("color", glm::vec3(1.0f));

    glBufferData(GL_ARRAY_BUFFER, gridVertices.size()*sizeof(glm::vec2), gridVertices.data(), GL_STATIC_DRAW);
    glVertexAttribPointer(0, 2, GL_FLOAT_VEC2, GL_FALSE, sizeof(glm::vec2), (void*)0);
    glEnableVertexAttribArray(0);

    glDrawArrays(GL_LINES, 0, gridVertices.size()*sizeof(glm::vec2));

    glClear(GL_DEPTH_BUFFER_BIT);
}

Я хотел бы стереть эти строки и понять, почему OpenGL делает это (или, возможно, это яно я не вижу где).

1 Ответ

0 голосов
/ 10 июня 2018

Это проблемная строка:

glDrawArrays(GL_LINES, 0, gridVertices.size()*sizeof(glm::vec2));

Если вы посмотрите документацию для этой функции , вы найдете

void glDrawArrays (GLenumрежим, сначала GLint, количество GLsizei);

count : указывает число отображаемых индексов

Но вы передаете размер байта.Следовательно, вы просите OpenGL нарисовать больше вершин, чем есть в вашем буфере вершин.Конкретная реализация OpenGL, которую вы используете, вероятно, читает после конца буфера вершин сетки и находит вершины из буфера вершин рыбы для рисования (но это поведение не определено).

Итак, просто измените его на

glDrawArrays(GL_LINES, 0, gridVertices.size());   

Общий комментарий: не создавайте буферы вершин каждый раз, когда вы хотите нарисовать одну и ту же вещь.Создайте их в начале приложения и используйте их повторно.Вы также можете изменить их содержание, если это необходимо, но будьте осторожны с этим, поскольку это идет с ценой производительности.Создание буферов вершин еще дороже.

...