[英]OpenGL 3.3 - Different rotation for 2 triangles
我遵循的是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
};
然后画我的两个三角形:
glDrawArrays(GL_TRIANGLES, 0, 6); // 3 indices starting at 0 -> 1 triangle
顶点着色器显然正在变换所有6个顶点。 我将如何制作此程序,以便仅第二个三角形旋转?
您将通过相同的顶点着色器使用相同的参数发送两个三角形。 您可以使用不同的参数分别通过着色器发送它们,也可以根据要执行的操作通过不同的着色器发送它们。 最简单的方法可能是这样的:
// 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.