2016-06-19 45 views
-1

我正在創建一個遊戲,當我渲染很多塊時。 fps嚴重下降,一切都滯後。我知道爲什麼它滯後,因爲同時渲染了許多對象,但我無法弄清楚如何創建和實現一個截錐體剔除或任何類型的剔除類到我的遊戲。如何實現Frustum剔除? (當渲染很多塊時延遲)

注:我正在使用VBOs。

我剛在網上找不到;請幫忙。

下面是我的一些代碼:

//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(); 
} 
} 

如果您想了解更多信息,如類或整個項目,請發表評論,提醒我。

+0

什麼是塊? – elect

+0

一個質感的立方體。 –

回答

0

OpenGL執行平截頭體剔除,它聽起來像需要對每一幀進行一些處理以決定要傳遞給OpenGL的哪些塊要渲染(或者不是每個幀,每次都需要新的平截頭體剔除計算或相機改變)。您需要構建平截頭體的表示並測試自己要渲染哪個幾何體。可視視錐體可被視爲音量,因此您正在查找該音量中包含哪些立方體。

首先要看哪個幾何體位於近剪裁平面之後,並且遠於剪裁平面。這可以通過簡單地計算到近端和遠端剪切平面的距離並確保它們位於飛機的正確一側來完成。

接下來要做的是檢查哪個幾何圖形在平截頭體中過於左或向右,並且由於性質和不同的投影而稍微複雜一點。由於正投影的視錐體本身基本上是立方體,因此正投影更容易計算。透視圖的形狀是梯形的(取決於視場),但原理是相同的。構建兩個平面,代表平截頭體的左和右截平面,並剔除與您的相機位置相關的「錯誤」側的幾何體。

您只需釋放GL的幾何圖形即可繪製出哪個GL決定不繪製。取決於場景,幾何體的大小,其存儲在緩衝區和其他方面的方式,綁定/解除綁定和頂點處理的開銷可能輕易地超過從剔除客戶端的任何性能。

我沒有寫java多年,所以無法提供源代碼,但是我已經列出了做這個客戶端(與OpenGL相關)最簡單的形式(並且不一定是優化的)。通過對幾何數據進行空間分組這種層次結構(包圍體積,KD樹,AABB等),您可以減少剔除所需的測試量。

在很多情況下,最基本的分層分組形式是Axis Aligned Bounding Box(AABB),它(如果您的多維數據集都沒有旋轉)是您使用多維數據集後已有的。離散幾何通常以某種形式使用由邊界框或「平板」(在它們之間定義一個體積的兩個平行平面)表示的長方體體積進行分組。

+0

謝謝!我現在知道該怎麼做。 :) –