OpenGLとJavaを用いてツクールのような2DタイルのマップをVBOを用いて描画しようとしているのですが、上手く行きません。
起きているエラーは以下の通りです。
・マップの表示が滅茶苦茶でおかしい。
・実行する度にマップの表示が変わる。
・何度も繰り返すとJava VMが落ちる。
このバグには法則性がなく、どうすればいいのかまるで分かりません。
下に問題点だと思われる一部のソースを書きます。よろしくお願いします。
Java
1/** 2 * タイルマップで扱うイメージのクラス 3 * このクラスを複数個作って、描画する 4 * @author USER 5 * 6 */ 7class TileImage 8{ 9 10 protected static final int POSITION_INDEX = 0; // index of vertex attribute "in_Position" 11 protected static final int COLOR_INDEX = 1; // index of vertex attribute "in_Color" 12 13 protected static final int FLOAT_NUM_BYTES; // sizeof(float) in bytes 14 protected static final int INT_NUM_BYTES; // sizeof(int) in bytes 15 protected static final int VEC4_BYTES; // sizeof(vec4) in bytes 16 17 static { 18 FLOAT_NUM_BYTES = Float.SIZE / Byte.SIZE; 19 INT_NUM_BYTES = Integer.SIZE / Byte.SIZE; 20 VEC4_BYTES = 4 * FLOAT_NUM_BYTES; 21 } 22 23 //テクスチャのクラス 24 protected Bitmap bitmap; 25 26 //座標のID 27 protected int vboIndexId; 28 protected int vboTexId; 29 30 //空間座標を入れている配列 31 protected float[] indexesArray; 32 //テクスチャの座標を入れている配列 33 protected float[] texturesArray; 34 35 //テクスチャのFloatBuffer 36 protected FloatBuffer textures; 37 38 //空間座標のFloatBuffer 39 protected FloatBuffer indexes; 40 41 42 public TileImage(Bitmap bitmap) 43 { 44 this.bitmap = bitmap; 45 } 46 /** 47 * 解放 48 */ 49 public void dispose() 50 { 51 bitmap.dispose(); 52 53 glDisableVertexAttribArray(POSITION_INDEX); 54 55 glDisableVertexAttribArray(COLOR_INDEX); 56 57 glBindBuffer(GL_ARRAY_BUFFER, 0); 58 59 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 60 61 glDeleteBuffers(vboIndexId); 62 63 glDeleteBuffers(vboTexId); 64 65 glBindVertexArray(0); 66 } 67 /** 68 * 描画する関数 69 */ 70 public void draw() 71 { 72 if(!bitmap.getImagePath().equals("")) 73 { 74 GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); 75 GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); 76 77 bitmap.bind(); 78 79 glBindBuffer(GL_ARRAY_BUFFER, vboIndexId); 80 GL11.glVertexPointer(3, GL_FLOAT, 0, 0l); 81 82 glBindBuffer(GL_ARRAY_BUFFER, vboTexId); 83 GL11.glTexCoordPointer(2, GL_FLOAT, 0, 0l); 84 85 GL11.glDrawArrays(GL_QUADS, 0, indexesArray.length); 86 87 GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); 88 GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); 89 90 glBindBuffer(GL_ARRAY_BUFFER, 0); 91 92 bitmap.unBind(); 93 } 94 } 95/** 96VBOのIDを作る処理 97*/ 98 public void vBOSet() 99 { 100 textures = BufferUtils.createFloatBuffer(texturesArray.length); 101 textures.put(texturesArray); 102 textures.rewind(); 103 104 vboTexId = glGenBuffers(); 105 106 glBindBuffer(GL_ARRAY_BUFFER, vboTexId); 107 glBufferData(GL_ARRAY_BUFFER, textures, GL_STATIC_DRAW); 108 109 indexes = BufferUtils.createFloatBuffer(indexesArray.length); 110 indexes.put(indexesArray); 111 indexes.rewind(); 112 113 vboIndexId = glGenBuffers(); 114 115 glBindBuffer(GL_ARRAY_BUFFER, vboIndexId); 116 glBufferData(GL_ARRAY_BUFFER, indexes, GL_STATIC_DRAW); 117 } 118 //以下、各種変数のゲッターとセッター 119 120}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。