独立地将每个对象渲染到空间中,并在3D场景之上渲染2D场景

时间:2019-05-22 11:01:54

标签: c++ opengl

剧透:这个问题很长,所以请耐心阅读直到结束。

问题1: 我正在制作一个池项目,由于每个对象的独立移动,我想分别渲染每个对象。 就目前而言,我将其堆叠到一个缓冲区中并将其呈现为一个块。 (边注:每个Ball对象和Table对象都在其中包含顶点和法线。)

问题2: 我正在尝试渲染2D条(代表震撼力),并且不会显示。我在渲染3d场景后称呼它

我看过this video几次,不明白我做错了什么。

我现在正在做什么(将对象堆叠到顶点缓冲区和法线缓冲区之后):(original source

  do {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(programID);
    glUniform3f(LightID, 0, 6, 4);
    computeMatricesFromInputs();
    ProjectionMatrix = getProjectionMatrix();
    ModelMatrix = glm::mat4(1.0);
    MVP = ProjectionMatrix * viewMatrix * ModelMatrix;
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
    glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix[0][0]);
    glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &viewMatrix[0][0]);

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


    glEnableVertexAttribArray(2);
    glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
    glVertexAttribPointer(
        2,                                // attribute
        3,                                // size
        GL_FLOAT,                         // type
        GL_FALSE,                         // normalized?
        0,                                // stride
        (void*)0                          // array buffer offset
    );

    glDrawArrays(GL_TRIANGLES, 0, vertices.size());
    DrawHUD();
    // Swap buffers
    glfwSwapBuffers(window);
    glfwPollEvents();
} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
    glfwWindowShouldClose(window) == 0);

我想要的是什么

do{
        for (int i = 0;  i < BALL_NUMBER; i++)
    {
        balls[i].draw();
    }

} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
    glfwWindowShouldClose(window) == 0); 

draw应该包含什么以及如何使它起作用?

1 个答案:

答案 0 :(得分:1)

您的顶级循环应:

  • 使用glClear清除颜色和深度缓冲区
  • 设置场景范围内的制服,例如灯光ID,投影和视图矩阵
  • 分别渲染每个球:(即Ball::draw方法)
    • 将模型矩阵设置为统一以在世界空间中旋转和/或重新定位球。这可能需要重新计算MVP统一,具体取决于您的着色器代码
    • (可选)以某种方式识别球(通过均匀地颜色不同或绑定不同的纹理)
    • 渲染共享的球网格(可以选择为球绑定VAO,然后调用glDrawArrays
  • 渲染HUD
  • 交换缓冲区

所有设置代码(加载网格,创建数组缓冲区和VAO,设置统一属性绑定)都应预先完成。