我不太明白如何在不使用glPopMatrix和glPushMatrix的情况下在OpenGL中进行移动。我只能通过在几个VAO上调用glDrawArray来实现它。
在下面的这个例子中,我可以使用着色器移动一个三角形来进行矩阵乘法。我不明白的是说我有几个点阵列。 points2 [],points3 []。如何在不必绘制多个VAO的情况下进行翻译?那么如何将所有内容放入一个VAO中,并且仍然能够说明带有points3 []的多个matrix3 []?
float points[] = {
0.0f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.0f, 0.0f, 0.0f,
0.5f, 0.0f, 0.0f,
0.5f, 0.5f, 0.0f
};
float matrix[] = {
1.0f, 0.0f, 0.0f, 0.0f, // first column
0.0f, 1.0f, 0.0f, 0.0f, // second column
0.0f, 0.0f, 1.0f, 0.0f, // third column
0.5f, 0.0f, 0.0f, 1.0f // fourth column
};
unsigned int points_vbo = 0;
glGenBuffers (1, &points_vbo);
glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
glBufferData (GL_ARRAY_BUFFER, 18 * sizeof (float), &points, GL_STATIC_DRAW);
unsigned int vao = 0;
glGenVertexArrays (1, &vao);
glBindVertexArray (vao);
glBindBuffer (GL_ARRAY_BUFFER, points_vbo);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
glBindBuffer (GL_ARRAY_BUFFER, colours_vbo);
glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL);
glEnableVertexAttribArray (0);
glEnableVertexAttribArray (1);
//Setup shaders
std::string vertex_shader = loadshaders("test_vs.txt");
std::string fragment_shader = loadshaders("test_fs.txt");
unsigned int vs = glCreateShader (GL_VERTEX_SHADER);
const char* str = vertex_shader.c_str ();
glShaderSource (vs, 1, &str, NULL);
glCompileShader (vs);
unsigned int fs = glCreateShader (GL_FRAGMENT_SHADER);
const char* strb = fragment_shader.c_str ();
glShaderSource (fs, 1, &strb, NULL);
glCompileShader (fs);
unsigned int shader_programme = glCreateProgram ();
glAttachShader (shader_programme, fs);
glAttachShader (shader_programme, vs);
glLinkProgram (shader_programme);
int matrix_location = glGetUniformLocation (shader_programme, "matrix");
glUseProgram (shader_programme);
glUniformMatrix4fv (matrix_location, 1, GL_FALSE, matrix);
答案 0 :(得分:1)
从GL固定管道转移到现代“核心”openGL时,常常需要解决这个问题。
通常,每次要“移动”几何体时,都必须自己更新矩阵。
glUseProgram(shader_id);
bind_textures();
bind_vaos_and_buffers();
matrix = math_library::createTranslationMatrix(x, y, z);
glUniformMatrix4fv (matrix_location, 1, GL_FALSE, matrix);
glDraw*(...);
matrix = math_library::createTranslationMatrix(x1, y1, z1);
glUniformMatrix4fv (matrix_location, 1, GL_FALSE, matrix);
glDraw*(...);
一般情况下:每次你想画一些东西:创建一个合适的矩阵,将它发送到活动着色器,然后调用'draw'命令。请注意那样使用一个几何数据,我们只需使用几种不同的转换来绘制几次。
math_library
- 例如可以是glm library
您可以阅读有关定位和移动的整章here