OpenGL 3.3 — Разное вращение для 2 треугольников

Я следую за серией opengl-tutorial.org, и учебник 3 рисует на экране треугольник. Код использует вершинный шейдер для преобразования вершин, подавая его в матрицу ModelViewProjection (MVP).

Я могу заставить треугольник вращаться вокруг его начала в каждой петле. Что я не могу найти, так это когда я добавляю второй треугольник, как я могу заставить только один из них вращаться, в то время как другой остается неподвижным. Вся эта трансформация вершин в шейдере, работающем вместе с основным циклом, сбивает меня с толку.

Вот часть кода прямо из учебника:

static const GLfloat g_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f,  1.0f, 0.0f,
};
static const GLushort g_element_buffer_data[] = { 0, 1, 2 };

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);

glm::mat4 View       = glm::lookAt(
glm::vec3(0,0,3),
glm::vec3(0,0,0),
glm::vec3(0,1,0));

glm::mat4 Model      = glm::mat4(1.0f);

glm::mat4 MVP        = Projection * View * Model;

do{

// Clear the screen
glClear( GL_COLOR_BUFFER_BIT );

// Use our shader
glUseProgram(programID);

// Send our transformation to the currently bound shader,
// in the "MVP" uniform
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

// 1rst attribute buffer : vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0,
3,                  // size
GL_FLOAT,           // type
GL_FALSE,           // normalized?
0,                  // stride
(void*)0            // array buffer offset
);

// Draw the triangle !
glDrawArrays(GL_TRIANGLES, 0, 3); // 3 indices starting at 0 -> 1 triangle

glDisableVertexAttribArray(0);

// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();

}

Чтобы повернуть, я использую это:

glm::mat4 Model      = glm::mat4(1.0f);

rot=rot+0.01f;
glm::vec3 myRotationAxis( 0, 0, 1);
Model = glm::rotate( Model, rot, myRotationAxis );

glm::mat4 MVP        = Projection * View * Model;

Я рисую второй треугольник, изменяя буфер вершин сверху:

static const GLfloat g_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f,  1.0f, 0.0f,
1.5f, 0.0f, -5.0f,
2.5f, 0.0f, -5.0f,
2.0f, 1.0f, -5.0f
};

А затем нарисуйте мои 2 треугольника:

glDrawArrays(GL_TRIANGLES, 0, 6); // 3 indices starting at 0 -> 1 triangle

Вершинный шейдер четко трансформирует все 6 вершин. Как бы я сделал эту программу, чтобы вращался только второй треугольник?

0

Решение

Вы отправляете оба треугольника через один и тот же вершинный шейдер с одинаковыми параметрами. Вы можете либо отправить их через шейдер отдельно, с разными параметрами, либо вы можете отправить их через разные шейдеры, в зависимости от того, что вы пытаетесь сделать. Самый простой способ — это примерно так:

// Draw the first triangle like you did above
glDrawArrays (GL_TRIANGLES, 0, 3);

// ... set up the matrix for the second triangle here ...

// Tell the shader about the new matrix
glUniformMatrix (MatrixID, 1, GL_FALSE, &MVP[0][0]);

// And draw starting at the second triangle
glDrawArrays (GL_TRIANGLES, 3, 3);
1

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

Других решений пока нет …