c++ - 将每个对象独立渲染到空间中,并在 3D 场景上渲染 2D 场景
问题描述
剧透:这个问题很长,所以请耐心阅读直到最后。
问题 1:我正在制作一个池项目,并且由于每个对象的独立移动,我想分别渲染每个对象。至于现在,我将它堆叠到一个缓冲区中并在一个块中渲染它。(旁注:每个 Ball 对象和 Table 对象都包含顶点和法线。)
问题 2:我正在尝试渲染 2D 条(代表打击力)并且它不会出现。我在渲染 3d 场景后调用它
我看过这个视频好几次了,不明白我做错了什么。
我现在在做什么(将对象堆叠到顶点缓冲区和正常缓冲区之后):(原始来源)
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、设置统一属性绑定)都应该预先完成。
推荐阅读
- python - LXML 在 Windows 10 中既不下载也不绑定
- python - 如何查看/打印保存在变量中但已删除代码的函数?
- json - 无法识别在 csv 文件中存储和使用的 json 请求正文的正确格式,以便在空手道场景中使用
- jquery - 如何在 jQuery 日期选择器中为禁用日期添加工具提示?
- vb.net - Vb.Net 2019 Windows 窗体应用程序无法在表单加载事件中连接到 Openoffice
- javascript - 使用 QuaggaJS 停止后如何启动相机
- d3.js - 在另一个过渡正在进行时开始一个过渡
- angular - 对组件的变化做出反应,避免使用 location.reload()
- powershell - 将输出转换为 CSV 和 Out-Grid
- .net - Tizen 手表表圈交互