#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) … это правильно или мне следует разделить его пополам?