でも、結構絡み合ってるんですよ? これが?
まず、VertexObjectで描画が基本なので、VBOクラスから。
import java.nio.FloatBuffer;
import java.util.ArrayList;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
/**
* VertexBufferObjectクラス
* @author ksz
*/
public class Vbo {
public float r=1,g=1,b=1,a=1,diffuse=1,ambient=1;
public int vSize, tSize;
private int vboID = -1;
private static int oldID = -1;
/**
* GLにVBOをセット
*/
public void bindVBO() {
if (oldID == vboID) return; //既に同じバッファがセットされていたら無視
if (vboID < 0) return; //makeBufferされてないようなので無視
oldID = vboID;
GL11 gl = Global.gl;
gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, vboID);
gl.glVertexPointer(3, GL11.GL_FLOAT, 0, 0); //頂点バッファ
if (tSize != 0) {
gl.glTexCoordPointer(2, GL11.GL_FLOAT, 0, vSize); //UVバッファ
}
}
/**
* VBOを描画します
*/
public void draw() {
GL11 gl = Global.gl;
//テクスチャ行列を外す
gl.glMatrixMode(GL10.GL_TEXTURE);
gl.glLoadIdentity();
gl.glColor4f(r, g, b, a);
bindVBO();
//vSizeは頂点配列のバイト数なので、floatにするのに/4 TRIANGLESなので3角ポリで/3 で/12
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vSize / 12);
}
/**
* 頂点とUVの配列からVBO作成
* @param v 頂点配列
* @param t UV配列
*/
public void makeBuffer(float v[], float t[]) {
vSize = v.length;
tSize = 0;
if (t != null && t.length != 0) {
tSize = t.length;
}
makeBuffer(v,vSize, t,tSize);
}
/**
* 頂点とUVの配列からVBO作成(サイズ指定版)
* @param v 頂点配列
* @param vCnt 頂点配列の有効要素数
* @param t UV配列
* @param tCnt UV配列の有効要素数
*/
public void makeBuffer(float v[],int vCnt, float t[],int tCnt) {
GL11 gl = Global.gl;
vSize = vCnt * 4;
tSize = tCnt * 4;
int vbo[] = new int[1];
gl.glGenBuffers(1, vbo, 0);
gl.glBindBuffer(GL11.GL_ARRAY_BUFFER, vbo[0]);
gl.glBufferData(GL11.GL_ARRAY_BUFFER, vSize + tSize, null, GL11.GL_STATIC_DRAW);
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, 0, vSize, FloatBuffer.wrap(v));
if (tSize != 0) {
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, vSize, tSize, FloatBuffer.wrap(t));
}
vboID = vbo[0];
}
}
ちなみに、ライティングは無視してるので、勝手に拡張してね。
Global.gl とかがさも当然のように使われてますが、GL11インスタンスはいろんなところから使うので、グローバルっぽく使うためにpublic static な領域にGl11インスタンスを渡してある前提で。
まだまだ続きます。
0 件のコメント:
コメントを投稿