没有glPush的OpenGL翻译和通过着色器的glPop。

时间:2013-07-24 15:40:52

标签: opengl

我不太明白如何在不使用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);

1 个答案:

答案 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