Как сгенерировать такой куб в 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 правильно, можете помочь с этим? Есть ли у вас идеи, как можно такой меш сгенерировать без повторяющихся и ненужных вершин в буфере, может, знаете, подход лучше?

