-2

我正在创建一个游戏,当我渲染许多块时。fps严重下降,一切都滞后。我知道它为什么会滞后,因为同时渲染了许多对象,但我不知道如何为我的游戏创建和实现截锥体剔除或任何类型的剔除类。

注意:我正在使用 VBO。

我只是在网上找不到;请帮忙。

这是我的一些代码:

//Render Game this were I render my game 
public void Render_GAME() {
    Update();
    if (isGameRunning == true) {
       Update();
       world.render();
       p1.Update();
       }
 }

平面类:我渲染块的地方

package game.terrain.biomes;

import core.camera.*;
import core.graphics.*;
import core.math.*;
import game.blocks.*;
import game.Player;

public class Flat{

//Global Variables:
private int width;
private int height;
private int depth;

private SpaceStone[][][] blocks;

public Flat(int width, int height, int depth)
{
    this.width = width;
    this.height = height;
    this.depth = depth;

    blocks = new SpaceStone[width][height][depth];

    createBlocks();
}

//Create Blocks
private void createBlocks()
{
    SpaceStone.createBlock();

    for(int x = 0; x < width; x += 5)
    {
        for(int y = 0; y < height; y += 5)
        {
            for(int z = 0; z < depth; z += 5)
            {
                blocks[x][y][z] = new SpaceStone(new Vector3f(x, y, z), new Vector3f(0, 0, 0), new Vector3f(2.5f, 2.5f, 5f));
            }
        }
    }
}

//Render Blocks
private void renderBlocks()
{   
    Shader.BLOCK.Enable();
    SpaceStone.blocktex.bindTexture();
    SpaceStone.block.Bind();

    Shader.BLOCK.setUniform1i("tex", 1);

    Matrix4f viewMatrix = Player.getViewMatrix(Player.getCamera()); 
    Shader.BLOCK.setUniformMat4f("pr_matrix", Player.getPerspective());

    for(int i = 0; i < width; i += 5)
    {
        for(int j = 0; j < height; j += 5)
        {
            for(int k = 0; k < depth; k += 5)
            {
                Matrix4f transform = new Transformation().getTransform(blocks[i][j][k], viewMatrix);
                Shader.BLOCK.setUniformMat4f("vw_matrix", transform);
                SpaceStone.block.Draw();
            }
        }
    }

    Shader.BLOCK.Disable();
    SpaceStone.blocktex.unbindTexture();
    SpaceStone.block.Unbind();
}

//Render Flat Biome
public void renderFlatBiome()
{
    //Render Blocks
    renderBlocks();
}
}

如果您想了解更多信息,例如课程或整个项目,请发表评论并通知我。

4

1 回答 1

0

OpenGL执行截锥体剔除,听起来您需要在每一帧都进行一些处理以决定将哪些块传递给OpenGL进行渲染(或者可能不是每一帧,每次几何体或相机发生变化时都需要新的截锥体剔除计算) . 您需要构建平截头体的表示并测试自己要渲染的几何图形。视锥体可以被认为是一个体积,因此您正在寻找该体积中包含哪些立方体。

首先是查看哪个几何图形位于近剪裁平面之后且比远剪裁平面更远。这可以通过简单地计算到近和远裁剪平面的距离并确保它们位于平面的正确一侧来完成。

接下来要做的是检查哪个几何体太左或太右而无法放入截锥体,由于性质和不同的投影,这稍微复杂一些。正交投影更容易计算,因为正交投影的平截头体本身就是长方体。透视是梯形的(取决于视场),但原理是一样的。构造两个平面,代表截头体的左右剪裁平面,并剔除与您的相机位置相关的“错误”侧的几何体。

您只是在释放几何图形的 GL 以绘制 GL 将确定无论如何都不绘制。根据场景、几何体的大小、其在缓冲区中的存储方式和其他方面,绑定/解除绑定和顶点处理的开销很容易超过剔除客户端对性能的任何影响。

我已经很多年没有写过java了,所以不能提供源代码,但是我已经概述了做这个客户端(与OpenGL相关)的最简单的形式(并且不一定是优化的)。通过空间分组几何数据这种某种形式的层次结构(边界体积、KD-tree、AABB 等),您可以减少剔除所需的测试量。

在很多情况下,最基本的层次分组形式是轴对齐边界框 (AABB),它(如果您的立方体都没有旋转)是您在使用立方体时已经拥有的。离散几何通常使用由边界框或“平板”(定义它们之间的体积的两个平行平面)表示的长方体体积以某种形式分组。

于 2016-06-19T13:08:02.553 回答