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