Как сгенерировать такой куб в OpenGL?

введите сюда описание изображения

Я использую VBO и EBO. На данный момент я генерирую такой куб, но у меня есть лишние вершины, которые лежат в VBO и я их просто не соединяю.

Мой куб с subdivision, красная точка - та вершина которая лежит в буфере, но я ее не соединяю с помощью EBO.

введите сюда описание изображения

My code:

void generateSubdivCube(std::vector<QVector3D>& vertices,
                         std::vector<unsigned int>& indicesTriangles,
                         std::vector<unsigned int>& indicesLines,
                         unsigned int subdivisions = 1)
{
    /*Check that it is quad and his direction counterclockwise*/
    QVector3D pos(0.0f, 0.0f, 0.0f);
    QVector3D size(1.0f, 1.0f, 1.0f);
    QVector3D startPoint((pos.x() - size.x())/2, (pos.y() - size.y())/2, (pos.z() - size.z())/2);

    QVector3D delta_z(0.0f, 0.0f, size.z() / subdivisions);
    QVector3D delta_x(size.x() / subdivisions, 0.0f, 0.0f);
    QVector3D delta_y(0.0f, size.y() / subdivisions, 0.0f);

    for(size_t iteration = 0; iteration <= subdivisions; ++iteration)
    {

        vertices.push_back(startPoint + delta_x * iteration);
        for(size_t iteration = 0; iteration < subdivisions; ++iteration)
            vertices.push_back(vertices.back() + delta_y);
    }

    size_t sizeXY = vertices.size();
    for(size_t iteration = 1; iteration <= subdivisions; ++iteration)
    {
        for(unsigned int i = 0; i < sizeXY; ++i)
            vertices.push_back(vertices[i] + delta_z * iteration);
    }


    /* -Z Plane*/
    unsigned int rowSize = subdivisions + 1;

    for(size_t row = 0; row < subdivisions; ++row)
    {
        for(unsigned int i = 0; i < subdivisions; ++i)
        {

            unsigned int firstPoint = rowSize * row;
            indicesTriangles.push_back( i + firstPoint ); /* first point */
            indicesTriangles.push_back( i + 1 + firstPoint ); /* top point */
            indicesTriangles.push_back( i + rowSize + firstPoint ); /* right point */

            indicesTriangles.push_back( i + rowSize + firstPoint );
            indicesTriangles.push_back( i + 1 + firstPoint );
            indicesTriangles.push_back( i + 1 + rowSize + firstPoint );

            indicesLines.push_back(i + firstPoint);
            indicesLines.push_back( i + 1 + firstPoint );
            indicesLines.push_back(i + firstPoint);
            indicesLines.push_back(i + rowSize + firstPoint);
            indicesLines.push_back(i + rowSize + firstPoint);
            indicesLines.push_back( i + 1 + rowSize + firstPoint );
            indicesLines.push_back( i + 1 + rowSize + firstPoint );
            indicesLines.push_back( i + 1 + firstPoint );


        }
    }



    /* +Z Plane*/
    for(size_t row = 0; row < subdivisions; ++row)
    {
        for(unsigned int i = 0; i < subdivisions; ++i)
        {

            unsigned int firstPoint = rowSize * row + rowSize * rowSize * subdivisions;
            indicesTriangles.push_back( i + firstPoint );
            indicesTriangles.push_back( i + 1 + firstPoint );
            indicesTriangles.push_back( i + rowSize + firstPoint );

            indicesTriangles.push_back( i + rowSize + firstPoint );
            indicesTriangles.push_back( i + 1 + firstPoint );
            indicesTriangles.push_back( i + 1 + rowSize + firstPoint );

            indicesLines.push_back(i + firstPoint);
            indicesLines.push_back( i + 1 + firstPoint );
            indicesLines.push_back(i + firstPoint);
            indicesLines.push_back(i + rowSize + firstPoint);
            indicesLines.push_back(i + rowSize + firstPoint);
            indicesLines.push_back( i + 1 + rowSize + firstPoint );
            indicesLines.push_back( i + 1 + rowSize + firstPoint );
            indicesLines.push_back( i + 1 + firstPoint );
        }
    }

    /* +X Plane*/
    for(size_t row = 0; row < subdivisions; ++row)
    {
        for(unsigned int i = 0; i < subdivisions; ++i)
        {

            unsigned int firstPoint = rowSize * rowSize * row + rowSize * subdivisions;
            indicesTriangles.push_back( i + firstPoint );
            indicesTriangles.push_back( i + 1 + firstPoint );
            indicesTriangles.push_back( i + rowSize * rowSize + firstPoint );

            indicesTriangles.push_back( i + rowSize * rowSize + firstPoint );
            indicesTriangles.push_back( i + 1 + firstPoint );
            indicesTriangles.push_back( i + 1 + rowSize * rowSize + firstPoint );

            indicesLines.push_back(i + firstPoint);
            indicesLines.push_back( i + 1 + firstPoint );
            indicesLines.push_back(i + firstPoint);
            indicesLines.push_back(i + rowSize * rowSize + firstPoint);

            indicesLines.push_back(i + rowSize * rowSize + firstPoint);
            indicesLines.push_back( i + 1 + rowSize * rowSize + firstPoint );
            indicesLines.push_back( i + 1 + rowSize * rowSize + firstPoint );
            indicesLines.push_back( i + 1 + firstPoint );
        }
    }


    /* -X Plane*/
    for(size_t row = 0; row < subdivisions; ++row)
    {
        for(unsigned int i = 0; i < subdivisions; ++i)
        {

            unsigned int firstPoint = rowSize * rowSize * row;
            indicesTriangles.push_back( i + firstPoint ); /*0*/
            indicesTriangles.push_back( i + 1 + firstPoint );
            indicesTriangles.push_back( i + rowSize * rowSize + firstPoint ); /*3*/

            indicesTriangles.push_back( i + rowSize * rowSize + firstPoint ); /*3*/
            indicesTriangles.push_back( i + 1 + firstPoint ); /*1*/
            indicesTriangles.push_back( i + 1 + rowSize * rowSize + firstPoint ); /*4*/

            indicesLines.push_back(i + firstPoint); /*0*/
            indicesLines.push_back( i + 1 + firstPoint ); /*1*/
            indicesLines.push_back(i + firstPoint); /*0*/
            indicesLines.push_back(i + rowSize * rowSize + firstPoint);  /*3*/

            indicesLines.push_back(i + rowSize * rowSize + firstPoint);  /*3*/
            indicesLines.push_back( i + 1 + rowSize * rowSize + firstPoint ); /*4*/
            indicesLines.push_back( i + 1 + rowSize * rowSize + firstPoint ); /*4*/
            indicesLines.push_back( i + 1 + firstPoint ); /*1*/
        }
    }



    /* +Y Plane*/
    for(size_t row = 0; row < subdivisions; ++row)
    {
        for(unsigned int i = 0; i < subdivisions; ++i)
        {

            unsigned int firstPoint = rowSize * row + subdivisions;

            indicesTriangles.push_back( i * (rowSize * rowSize) + firstPoint );
            indicesTriangles.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize );
            indicesTriangles.push_back( i * (rowSize * rowSize) + rowSize + firstPoint );

            indicesTriangles.push_back( i * (rowSize * rowSize) + rowSize + firstPoint );
            indicesTriangles.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize );
            indicesTriangles.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize + rowSize );

            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint );
            indicesLines.push_back( i * (rowSize * rowSize) + rowSize + firstPoint );

            indicesLines.push_back( i * (rowSize * rowSize) + rowSize + firstPoint );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize + rowSize );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize + rowSize );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize );
        }

    }

    /* -Y Plane*/
    for(size_t row = 0; row < subdivisions; ++row)
    {
        for(unsigned int i = 0; i < subdivisions; ++i)
        {

            unsigned int firstPoint = rowSize * row;

            indicesTriangles.push_back( i * rowSize * rowSize + firstPoint );
            indicesTriangles.push_back( i * rowSize * rowSize + firstPoint + rowSize * rowSize );
            indicesTriangles.push_back( i * rowSize * rowSize + rowSize + firstPoint );

            indicesTriangles.push_back( i * rowSize * rowSize + rowSize + firstPoint );
            indicesTriangles.push_back( i * rowSize * rowSize + firstPoint + rowSize * rowSize );
            indicesTriangles.push_back( i * rowSize * rowSize + firstPoint + rowSize * rowSize + rowSize );

            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint );
            indicesLines.push_back( i * (rowSize * rowSize) + rowSize + firstPoint );

            indicesLines.push_back( i * (rowSize * rowSize) + rowSize + firstPoint );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize + rowSize );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize + rowSize );
            indicesLines.push_back( i * (rowSize * rowSize) + firstPoint + rowSize * rowSize );
        }

    }


}

В данной части кода:

size_t sizeXY = vertices.size();
    for(size_t iteration = 1; iteration <= subdivisions; ++iteration)
    {
        for(unsigned int i = 0; i < sizeXY; ++i)
            vertices.push_back(vertices[i] + delta_z * iteration);
    }

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


Ответы (0 шт):