Сгенерировать и нарисовать квадратную плоскость с помощью GL_TRIANGLES?

Предисловие:

Я прочитал сообщение по адресу Создайте плоскость с треугольными полосами. Код ниже взят оттуда, однако он не позволяет мне текстурировать или освещать сетку.

Цель:

Получив число «n», сгенерируйте, текстурируйте и нарисуйте плоскость width = n &height = n с помощью OpenGL. Плоскость должна быть сделана из отдельных четверок единичного размера.

Код пока:

Код для генерации вершин

float * Plane::getUniqueVertices()
{
    if (uniqueVertices) return uniqueVertices;

    uniqueVertices = new float[NUM_VERTICES];
    int i = 0;

    for (int row = 0; row<height; row++) {
        for (int col = 0; col<width; col++) {
            uniqueVertices[i++] = (float)col; //x
            uniqueVertices[i++] = (float)row; //y
            uniqueVertices[i++] = 0.0f;        //z
        }
    }

    return uniqueVertices;
} 

Код для генерации индексов

int * Plane::getIndices()
{
    if (indices) return indices;

    indices = new int[NUM_DRAW_ELEMENTS];
    int i = 0;

    for (int row = 0; row<height - 1; row++) 
    {
        if ((row & 1) == 0) // even rows
        { 
            for (int col = 0; col<width; col++) 
            {
                indices[i++] = col + row * width;
                indices[i++] = col + (row + 1) * width;
            }
        }
        else // odd rows
        { 
            for (int col = width - 1; col>0; col--) 
            {
                indices[i++] = col + (row + 1) * width;
                indices[i++] = col - 1 + +row * width;
            }
        }
    }

    if ((height & 1) && height > 2) 
    {
        indices[i++] = (height - 1) * width;
    }

    return indices;
} 

Затем я рисую плоскость, используя GL_TRIANGLE_STRIP и индексный буфер.

Что мне нужно?:

Хотя приведенное выше работает, я не могу текстурировать / UV-карту или получать нормали, поскольку она использует GL_TRIANGLE_STRIP, поэтому координаты UV различаются для некоторых вершин, которые являются общими для треугольников. Мне нужен какой-то способ получить массив вершин, их текстурные координаты и нормали, чтобы я мог текстурировать и освещать плоскость, чтобы в итоге получилось вот так. Неважно, как я их получу, пока самолет состоит из разных квадов и я могу изменить размеры самолета.


person iansmathew    schedule 07.04.2018    source источник
comment
Предположим, что вершина имеет (x,y,z,u,v) координаты, а не только (x,y,z). Какие изменения вам нужно было бы внести?   -  person 1201ProgramAlarm    schedule 08.04.2018
comment
@ 1201ProgramAlarm Это сработает, но единственная проблема, о которой я упоминал выше, заключается в том, что некоторые вершины являются общими для треугольников, поэтому для первого треугольника uv будет другим для этой вершины для следующего треугольника.   -  person iansmathew    schedule 08.04.2018
comment
@iansmathew Я пытаюсь намекнуть, что если вы считаете координаты 5D, а не 3D, у вас нет дубликатов.   -  person 1201ProgramAlarm    schedule 08.04.2018
comment
@ Rabbid76 Я не совсем понимаю, как я буду переключаться между u1 и u2. Насколько я понимаю, у меня есть массив вершин, массив индексов и массив texCoord.   -  person iansmathew    schedule 08.04.2018
comment
@ 1201ProgramAlarm Думаю, я понимаю, что вы имели в виду. Итак, я бы начал генерировать свои вершины как обычно, но для каждой вершины я бы нажимал другую вершину с теми же самыми x, y, z, но с другими координатами uv? Это правильно?   -  person iansmathew    schedule 08.04.2018
comment
Так зачем вообще нужны разрывы в координатах текстуры при наложении текстуры на плоскость?   -  person derhass    schedule 08.04.2018
comment
@derhass, потому что, если вершина является общей для двух треугольников (как в случае с полосой треугольника), разве вам не нужны разные координаты текстуры? Нижняя правая вершина одного треугольника может быть нижней левой вершиной другого   -  person iansmathew    schedule 08.04.2018
comment
Я не понимаю, как это может быть актуально. Вы не описали, какое отображение вы на самом деле хотите получить, поэтому естественно делать правдоподобные предположения. А при сопоставлении 2D-текстуры с плоской прямоугольной 2D-формой (это не совсем плоскость, поскольку она не бесконечна) возможны следующие случаи: а) 2D-текстура должна быть отображена на всю площадь прямоугольника или б) 2D-текстура должна быть сопоставлена ​​с каждым квадратом прямоугольника. В обоих случаях нет необходимости в каких-либо разрывах в параметризации. б) на самом деле является лишь масштабированным вариантом а) с учетом режимов переноса.   -  person derhass    schedule 08.04.2018
comment
@Rabbid76: Если это так, он должен описать это в вопросе.   -  person derhass    schedule 08.04.2018