我正在开发一个简单的Minecraft克隆,以扩展我对opengl编程的了解。 我正在使用Glew,glfw,glm和OpenGL 3.3版。 一切都运行正常,除非我得到一个可怕的fps,即使在渲染一个Chunk时也是如此。
为了优化,我编写了一种算法,只渲染可见的立方体,然后只渲染这些立方体上的可见面。 我也在使用CULL_FACE来停止渲染不必要的面孔。
现在每个块都是一个对象。在其中我有一个数组,其中包含要渲染的立方体和面。
int renderVisible[FRAGMENTSIZE*FRAGMENTSIZE*FRAGMENTSIZE][6];
最后一个维度获得1或0,具体取决于它是否将被渲染。
我还为每个chunk都有一个renderIndex,它显示了在rendervisible和renderPosition数组中必须循环多少个多维数据集。
主渲染循环的伪代码如下所示,这是主渲染循环:
// Clear the screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Use our shader
glUseProgram(programID);
// Get the MVP matrix from user input
getInputs();
glm::vec3 lightPos = glm::vec3(16,120,16);
glUniform3f(LightID, lightPos.x, lightPos.y, lightPos.z);
// Bind our texture in Texture Unit 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Texture);
// Set our "myTextureSampler" sampler to user Texture Unit 0
glUniform1i(TextureID, 0);
// 1rst attribute buffer : vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0, // attribute. No particular reason for 0, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// 2nd attribute buffer : UVs
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glVertexAttribPointer(
1, // attribute. No particular reason for 1, but must match the layout in the shader.
2, // size : U+V => 2
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// 3rd attribute buffer : normals
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
);
glm::mat4 ProjectionMatrix = getProjectionMatrix();
glm::mat4 ViewMatrix = getViewMatrix();
// main Chunk/fragment loop
for(int frags = 0; frags < fragmentlist.size(); frags++) {
//check what fragments need to be rendered or not
Fragment chunk = fragmentlist[frags];
glm::vec3 chunkAngle = chunk.getRenderAng();
for(int i = 0 ; i < chunk.getIndex(); i++) {
glm::mat4 ModelMatrix = glm::mat4(1.0);
ModelMatrix = glm::rotate(ModelMatrix, chunkAngle.x, vec3(1,0,0));
ModelMatrix = glm::rotate(ModelMatrix, chunkAngle.y, vec3(0,1,0));
ModelMatrix = glm::rotate(ModelMatrix, chunkAngle.z, vec3(0,0,1));
ModelMatrix = glm::translate(ModelMatrix, chunk.getRenderPos(i));
//ModelMatrix = glm::scale(ModelMatrix,glm::vec3(3,1,3));
glm::mat4 MVP = ProjectionMatrix * ViewMatrix * ModelMatrix;
// Send our transformation to the currently bound shader,
// in the "MVP" uniform
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix[0][0]);
glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &ViewMatrix[0][0]);
// Draw the correct faces
for(int idx = 0; idx < 6; idx++) {
draw = chunk.getVisible(i,idx);
if(draw==1) {
glDrawArrays(GL_TRIANGLES, (idx*2)*3, 6);
}
}
}
}
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
// Swap buffers
glfwSwapBuffers();
你是否看到任何初学者的错误可以解释我得到的可怕的fps? 使用2个渲染的块/片段,我得到5fps。