Как нарисовать плоскую плоскость в OpenGL, рисуя треугольники?

#c #opengl #glm-math #terrain

Вопрос:

 void Terrain::draw_terrain(const Inputamp; in)
{

    this->P = glm::mat4(1.0f);
    this->V = glm::mat4(1.0f);
    this->M = glm::mat4(1.0f);

    P = in.P;
    V = in.V;

    M = glm::scale(M, glm::vec3(1.0f, 1.0f, 1.0f));
    // loop through each row
    for (int row = 0; row < terrain_height; row  )
    {
        int col;
        // adding a row of vertices
        for (col = 0; col < terrain_width - 1; col  ) {
            // x, y, z, 1
            terrain_verts.emplace_back(col, row, 0.0f, 1);

        }

        // adding a row of indices
        // blue color
        for (col = 0; col < terrain_width - 1; col  )
        {
            terrain_indices.emplace_back(col   row * terrain_width);
            terrain_indices.emplace_back(col   row * terrain_width   1);
            terrain_indices.emplace_back(col   terrain_width * (row   1) - 1);
        }

        // green color
        for (col = terrain_width - 1; col > 0; col--)
        {
            terrain_indices.emplace_back(col   row * terrain_width);
            terrain_indices.emplace_back(col   terrain_width * (row   1) - 1);
            terrain_indices.emplace_back(col   terrain_width * (row   1));
        }

        // adding a row of texture coordinates
        if (row % 2 == 0)
        {
            for (col = 0; col < terrain_width; col  = 2)
            {
                terrain_texture_coordinates.emplace_back(0, 0);
                terrain_texture_coordinates.emplace_back(1, 0);
            }
            
        }
        else
        {
            for (col = 0; col < terrain_width; col  = 2)
            {
                terrain_texture_coordinates.emplace_back(0, 1);
                terrain_texture_coordinates.emplace_back(1, 1);
            }
        }
    }

    spLambertTextured->use();
    glUniformMatrix4fv(spLambertTextured->u("P"), 1, false, glm::value_ptr(P));
    glUniformMatrix4fv(spLambertTextured->u("V"), 1, false, glm::value_ptr(V));
    glEnableVertexAttribArray(spLambertTextured->a("vertex"));
    glEnableVertexAttribArray(spLambertTextured->a("texCoord"));
    glEnableVertexAttribArray(spLambertTextured->a("normal"));

    glUniformMatrix4fv(spLambertTextured->u("M"), 1, false, glm::value_ptr(M));

    glVertexAttribPointer(spLambertTextured->a("vertex"), 4, GL_FLOAT, false, 0, terrain_verts.data());
    glVertexAttribPointer(spLambertTextured->a("texCoord"), 2, GL_FLOAT, false, 0, terrain_texture_coordinates.data());
    glVertexAttribPointer(spLambertTextured->a("normal"), 4, GL_FLOAT, false, 0, terrain_norms.data());

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, tex);
    glUniform1i(spLambertTextured->u("tex"), 0);

    glDrawElements(GL_TRIANGLES, terrain_indices_count(), GL_UNSIGNED_INT, terrain_indices.data());

    glDisableVertexAttribArray(spLambertTextured->a("vertex"));
    glDisableVertexAttribArray(spLambertTextured->a("color"));
    glDisableVertexAttribArray(spLambertTextured->a("normal"));

}

 

Во-первых, я добавил все вершины в первом цикле «для». Затем я хотел добавить индексы, сначала перейдя в синее направление, затем в зеленое направление. Затем я поднимался вверх, проходя через каждый ряд. Я установил terrain_width и terrain_height равными 6. Результат отображается на красном фоне.

порядок, в котором я хотел нарисовать индексы

результат, который я получил

Как исправить индексацию, чтобы иметь плоскую плоскость?

Комментарии:

1. О каком самолете ты говоришь? Правильна ли математика?

2. Я имел в виду нарисовать плоскую поверхность, которая будет покрыта травой.

3. Зачем вам нужно больше двух треугольников, если он все равно будет плоским?

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

5. Я вижу, что мои цифры неверны, но вы поняли, в чем дело 🙂

Ответ №1:

Возможно, вам захочется добавить некоторое значение к z-компоненту ваших вершин. Установка всех z = 0,0 f, по сути, делает его 2D-плоскостью, и вы можете не видеть текстуру эффективно.

Комментарии:

1. Я проверил это ,и если я установлю z=0,01 f или z=0,1 f, поверхность переместится вверх.

2. Для координат текстуры, номер вершины 0, это будет координата (0,0), затем: вершина 1 -> (1,0) вершина 2 ->> (0,0) вершина 3 ->>> (1,0) вершина 4 ->>>> (0,0) вершина 5 ->>>>> (1,0) тогда следующий сейчас… верт 6 ->>>>>> (0,1) верт 7 ->>>>>>> (1,1) верт 8 ->>>>>>>> (0,1) … это правильно или мне следует разделить его пополам?