wuzhiの日記: JOGLの頂点バッファオブジェクト
自作ゲームプログラムで,弾の描画に,頂点バッファオブジェクトを試してみた.
//フィールド
// バッファオブジェクトの名前
static int[] vboIdBuff=new int[2];
//バッファデータ領域の実体
static double[] bulletBufferArray=new double[50000];//てきとーに確保
static DoubleBuffer bulletBuffer =DoubleBuffer.wrap(bulletBufferArray);
static int bulletBufferIndex=0;//配列インデクス
...
public void init(GLAutoDrawable drawable) {
...
// バッファオブジェクトの名前を作成します
gl.glGenBuffers(vboIdBuff.length, vboIdBuff,0);
}
public void display(GLAutoDrawable drawable) {
...
// bulletBufferArray[]に弾の頂点データを詰め込んだ後
// 頂点データ座標の配列を有効にします
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
// 頂点データオブジェクトのIDを指定します
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vboIdBuff[0]);
//頂点データを用いてバッファオブジェクトを確保し初期化する
gl.glBufferData(
GL.GL_ARRAY_BUFFER,
bulletBuffer.capacity()*BufferUtil.SIZEOF_DOUBLE,
bulletBuffer,
GL.GL_STATIC_DRAW);
gl.glVertexPointer(3, GL.GL_DOUBLE, 0, 0);
// 描画します
try {
gl.glDrawArrays(GL.GL_POINTS, 0, bulletBufferIndex*3);
}catch(Exception e) {
System.err.println("Exception:"+e);
}
// 頂点データ座標の配列を無効にします
gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
//リセット
bulletBufferIndex=0;
...
}
大体こんな感じ.
とりあえず描画できたけど,今までより速くはならなかった.
頂点数が2~3千ぐらいでは,あまり効果ないのだろうか.
JOGLの頂点バッファオブジェクト More ログイン