剧透:这个问题很长,所以请耐心阅读直到结束。
问题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
应该包含什么以及如何使它起作用?
答案 0 :(得分:1)
您的顶级循环应:
glClear
清除颜色和深度缓冲区Ball::draw
方法)
MVP
统一,具体取决于您的着色器代码glDrawArrays
)所有设置代码(加载网格,创建数组缓冲区和VAO,设置统一属性绑定)都应预先完成。