2016-06-19 6 views
-1

私は多くのブロックをレンダリングするときにゲームを作成しています。 fpsは大幅に低下し、すべてが遅れます。一度に多くのオブジェクトがレンダリングされるため、なぜそれが遅れているのか分かりますが、私は自分のゲームに錐台の淘汰やあらゆるタイプの淘汰のクラスを作成して実装する方法を理解できません。Frustum Cullingの実装方法は? (多くのブロックをレンダリングするときの遅れ)

注:私は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に渡すかを決定するためにフレームごとに何らかの処理を行う必要があるように聞こえます(またはフレームごとではない場合もあります。カメラが変わります)。錐台の表現を作成し、レンダリングするジオメトリを自分自身でテストする必要があります。視聴錐台はボリュームと見なすことができるため、そのボリューム内に含まれるキューブを探しています。

まず最初はニアクリッピング面とファークリッピング面よりさらに後ろにあるジオメトリを確認することです。これは、近位および遠方のクリッピング面までの距離を単純に計算し、それらがプレーンの正しい面にあることを確認することによって実行できます。

次にする事はジオメトリがあまりにも遠く残っている小切手または錐台にフィットする権利であり、これは少し複雑に起因自然と異なる投影にあります。正射投影は、本質的に立方体そのものなので、正射影投影は計算がずっと簡単です。パースペクティブは、(視界に依存して)形状が台形であるが、原理は同じである。錐台の左右のクリッピング面を表す2つの平面と、カメラの位置に関連して「間違った」面である亀のジオメトリを作成します。

あなたは、単にGLはとにかく描くように判断されます描画する幾何学のGLを軽減しています。シーン、ジオメトリのサイズ、バッファやその他の側面に格納される方法に応じて、バインド/アンバインドのオーバーヘッドと頂点処理は、クライアント側を間引くことによるパフォーマンスのヒットを上回ることがあります。

私は、しかし、私は(のOpenGLに関連して)このクライアント側を行うための最も簡単な形式を(必ずしも最適化されていない)概説しているので、ソースを提供することができない年のためのJavaを書いていません。空間グループ化ジオメトリデータによって、これは何らかの階層構造(バウンディングボリューム、KDツリー、AABBなど)によって、カリングに必要なテストの量を減らすことができます。

多くの場合、階層的なグループ化の最も基本的な形式はABCB(Axis Aligned Bounding Box)です。キューブを使用しているので、既にどのキューブにもローテーションがない場合です。離散幾何学は、通常、バウンディングボックスまたは「スラブ」(それらの間にボリュームを定義する2つの平行な平面)で示される立方体ボリュームを使用して、いくつかの形式でグループ化されます。

+0

ありがとうございます!私は実際に今何をすべきか知っています。 :) –

関連する問題