Проблемы с созданием плоскости OpenGL из треугольников

Я пытаюсь создать плоскость, используя OpenGL, в некоторой степени код работает, но я получаю странные результаты по некоторым показателям. Я постараюсь объяснить свой код как можно лучше, это смесь моего кода и того, что я нашел в Интернете.

Главный:

Все настройки происходят в основном, поэтому функция будет знать все необходимые значения

float zoom = 6.0f;
float vertical = 1.2f;
float horizontal = 1.2f;

const int planeWidth = 4;  //columns
const int planeHeight = 2; //rows

const int totalVertices = (planeWidth + 1) * (planeHeight + 1);

//GLfloat* vertices = new GLfloat[totalVertices];
GLfloat vertices[totalVertices] = { 0.0 };

const int indPerRow = planeWidth * 2 + 2;
const int indDegenReq = (planeHeight - 1) * 2;
const int totalIndices = indPerRow * planeWidth + indDegenReq;

//GLuint* indices = new GLuint[totalIndices];
GLuint indices[totalIndices] = { 0 };

GLfloat texCoords[totalVertices] = { 0 };

makePlane(planeWidth, planeHeight, vertices, indices, texCoords);

Функция:

Первый цикл for создает вершины, а второй — индексы

void makePlane(int width, int height, GLfloat *vertices, GLuint *indices)
{
width++;  //columns
height++; //rows

int size = sizeof(GLfloat);
for (int y = 0; y < height; y++)
{
int base = y * width;
for (int x = 0; x < width; x++)
{
int index = (base + x) * 2;
vertices[index]    = (float)x;
vertices[index +1] = (float)y;
}
}

int i = 0;
height--;

for (int y = 0; y < height; y++)
{
int base = y * width;

for (int x = 0; x < width; x++)
{
indices[i++] = base + x;
indices[i++] = base + width + x;
}
if (y < height - 1)
{
indices[i++] = ((y + 1) * width + (width - 1));
indices[i++] = ((y + 1) * width);
}
}
}

Результат:

4 х 2

Индексы 0, 5, 1, 6, 2, 7, 3, 8, 4, 9, 9, 5, 5, 10, 6, 11, 7, 12, 8, 13, 9, 14, 0, 0, 0 , 0, 0, 0, …} unsigned int [42]

Это делает 22 значения правильно, а затем остальные нули.

Есть идеи почему?

0

Решение

Я думаю, что ваш цикл должен выглядеть примерно так (остерегайтесь непроверенных :). По сути, это выглядит как циклическое прохождение квадратов и вывод индексов для пар треугольников.

for (int y = 0; y < height; y++)
{
unsigned int base = y * width;
unsigned int top = base + width;
for (int x = 0; x < (width-1); x++)
{
indices[i++] = base + x;
indices[i++] = top + x;
indices[i++] = top + x + 1;

indices[i++] = top + x + 1;
indices[i++] = base + x + 1;
indices[i++] = base + x;
}
}
0

Другие решения

Я понял, что вершины создавались снизу вверх и индексы были заказаны для создания треугольников сверху вниз. Поэтому я изменил создание вершины для цикла.

int index = 0;
for (int y = height; y >= 0; y--)
{

for (int x = 0; x <= width; x++)
{
vertices[index] = ((float)x/4)-0.5;
vertices[index +1] = ((float)y/4)-0.5;
vertices[index + 2] = 0.0f;
index += 3;
}
}

Он создает вершины сверху вниз слева направо. Петля для индексов осталась прежней:

int i = 0;
++width;
GLuint indices2[170] = { 0 };

for (int y = 0; y < height; y++)
{
int base = y * width;

for (int x = 0; x < width; x++)
{
indices[i++] = base + x;
indices[i++] = base + width + x;
}
if (y < height - 1)
{
indices[i++] = ((y + 1) * width + (width - 1));
indices[i++] = ((y + 1) * width);
}
}
0

По вопросам рекламы [email protected]