ここはc言語について質問するところのようですがほかにOpenGLESについて質問できるところがなさそうだったのと
OPENGL ESについて質問している方がいらっしゃったようなのでここで質問させていただきました
現在JavaとOpenGLESでandroidアプリを作っているのですが
矩形の大きさを変えて複数の矩形を表示したいのですがうまくいきません
現象としては一番最後にバッファに転送した座標がすべての矩形に適用されてしまいます
(32x32の画像を生成した後に128x128の画像を生成するとすべて128x128の大きさになってしまう)
テクスチャはglBindTextureすれば切り替えれるようですが座標はそうはいかないようです
(うまく説明できないので実際のソースコードを張ります)
これを画像一つ一つに個別の大きさを指定してその大きさの通りに描画したいです
//スプライトクラス
float vbo[] = {
0.0f,0.0f,0.0f, 0.0f,
0.0f,0.0f,0.0f, 1.0f,
0.0f,0.0f,1.0f, 0.0f,
0.0f,0.0f,1.0f, 1.0f,
};
//スプライトの生成
public BufferID create(GL10 gl,Resources res,float spriteSizeX, float spriteSizeY,Bitmap bitmap){
vbo[1] = spriteSizeY;
vbo[8] = spriteSizeX;
vbo[9] = spriteSizeY;
vbo[12] = spriteSizeX;
ByteBuffer bytebuffer = ByteBuffer.allocateDirect(vbo.length * 4);
bytebuffer.order(ByteOrder.nativeOrder());
vertices = bytebuffer.asFloatBuffer();
vertices.put(vbo);
vertices.position(0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
GL11 gl11 = (GL11) gl;
{
int[] buffers = new int[1];
gl11.glGenBuffers(buffers.length, buffers,0);
vertexID = buffers[0];
//Log.v("posBufferObject",String.valueOf(vertexID));
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, vertexID);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER,vertices.capacity() * 4,vertices,GL11.GL_STATIC_DRAW);
}
gl11.glVertexPointer(2, GL10.GL_FLOAT,4*4, 0);
gl11.glTexCoordPointer(2, GL10.GL_FLOAT, 4*4, 4*2);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER,0);
{
gl.glEnable(GL10.GL_TEXTURE_2D);
int[] buffers = new int[1];
gl.glGenTextures(buffers.length, buffers,0);
textureID = buffers[0];
//Log.v("Create",String.valueOf(textureID));
gl.glBindTexture(GL10.GL_TEXTURE_2D,textureID);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0 ,bitmap,0);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
bitmap.recycle();
}
BufferID bufferID = new BufferID(vertexID,textureID);
return bufferID;
}
//スプライトクラスの描画関数
public void draw(GL10 gl,float x,float y,float lineX,float lineY,float spriteSizeX,float spriteSizeY,int textureSizeX,
int textureSizeY,float scaleX,float scaleY,float angle,BufferID bufferID){
GL11 gl11 = (GL11) gl;
//わかりやすくするためにアルファブレンドを一時的に無効
//gl.glEnable(GL10.GL_BLEND);
//gl.glEnable(GL10.GL_ALPHA_TEST);
//gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glMatrixMode(GL10.GL_TEXTURE);
gl.glBindTexture(GL10.GL_TEXTURE_2D,bufferID.textureID);
gl.glLoadIdentity();
gl.glScalef(spriteSizeX/textureSizeX,spriteSizeY/textureSizeY,1.0f);
gl.glTranslatef(lineX, lineY,0);
gl.glPushMatrix();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER,bufferID.vertexID);
gl.glLoadIdentity();
gl.glTranslatef(x,y,1);
gl.glTranslatef(spriteSizeX/2,spriteSizeY/2,1);
gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);
gl.glTranslatef(-spriteSizeX/2,-spriteSizeY/2,-1);
gl.glScalef(scaleX,scaleY, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);
gl.glPopMatrix();
}
//スプライトを持たせたいクラスのスプライト生成
InputStream is = res.openRawResource(R.drawable.test);
Bitmap bitmap;
try{
bitmap = BitmapFactory.decodeStream(is);
}
finally{
try{
is.close();
}
catch(IOException e){}
}
textureSizeX = bitmap.getWidth();
textureSizeY = bitmap.getHeight();
bufferID = sprite.create(gl,res,spriteSizeX,spriteSizeY,bitmap);
//描画関数の呼び出し
//スプライトを描画したいクラスにSpriteクラスのインスタンスを持たせて関数を読んでいます
sprite.draw(gl,x,y,animeCounter,moveDirection,spriteSizeX,spriteSizeY,textureSizeX,textureSizeY,scaleX,scaleY,angle,bufferID);
//BufferIDはint型の整数を二つ宣言しただけのクラスです
自分はOpenGL ESについてよくわかってないのでどうしてうまくいかないのかわかりません
よければなぜこうなってしまうかも教えてくださるとうれしいです