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

Rendering each object into the space independently and rendering 2D scene over 3D scene

本文关键字:3D 场景 并在 2D 对象 空间      更新时间:2023-10-16

扰流板:这个问题很长,请耐心等待直到结束。

问题编号1:我正在制作一个池项目,并且由于每个对象的独立移动,我想分别渲染每个对象。至于目前,我将其堆放到一个缓冲区中,然后将其构成一块。(侧面注意:每个球对象和表格对象都包括顶点和正常。(

问题编号2:我试图渲染2D栏(代表引人注目的力量(,它不会出现。我在渲染3D场景

后就称呼它

我已经看了几次视频,不明白我做错了什么。

我现在正在做的事情(将对象堆叠到vertexbuffer和normalbuffer之后(:(原始源(

  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应该包含什么?如何使其起作用?

您的顶级循环应该:

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

所有设置代码(加载网格,创建数组缓冲区和VAO,设置均匀 - 属性绑定(都应在前面进行。