OpenGL Minecraft优化。 (VC ++,gl3.3)

时间:2012-09-26 13:20:56

标签: optimization opengl-3

我正在开发一个简单的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。

0 个答案:

没有答案