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

标签 c++ opengl

剧透:本题较长,请耐心看完。

问题编号 1: 我正在制作一个泳池项目,由于每个对象的独立运动,我想单独渲染每个对象。 至于现在,我正在将它堆叠到一个缓冲区中并在一个 block 中渲染它。 (旁注:每个 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 应该包含什么,我如何让它发挥作用?

最佳答案

你的顶级循环应该:

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

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

关于c++ - 将每个对象独立渲染到空间中,并在 3D 场景上渲染 2D 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56255353/

相关文章:

c++ - 与当前 OpenGL 上下文对应的唯一 OpenCL 上下文

c++ - 变量在调用 lambda 之前被销毁

c++ - wglGetProcAddress 返回 NULL

c++ - 对 openGL 版本感到困惑

c++ - 有没有办法在编译时检测是否可以使用给定的一组参数类型成功调用通用 lambda?

opengl - 在openGL中重新编译着色器

c++ - 简单的C++,Linux 的opengl 游戏引擎?

c++ - 在 C++ 中将图像数据(R、G 和 B 像素)读入二维数组

c++ - MFC "Hidden"或 "Default"功能键加速器?

c++ - 在 Linux 上使用 C++ 获取事件的 TCP/UDP 连接