でも、結構絡み合ってるんですよ? これが?
まず、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 件のコメント:
コメントを投稿