opengl esでいろいろな大きさの矩形を表示できない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
saba

opengl esでいろいろな大きさの矩形を表示できない

#1

投稿記事 by saba » 12年前

初めまして
ここは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についてよくわかってないのでどうしてうまくいかないのかわかりません
よければなぜこうなってしまうかも教えてくださるとうれしいです

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: opengl esでいろいろな大きさの矩形を表示できない

#2

投稿記事 by ISLe » 12年前

引数が無駄に多いように感じますが、問題のある動作について、どういう実引数を与えて、どのような現象になるのか、具体的に書いていただけないでしょうか。

saba

Re: opengl esでいろいろな大きさの矩形を表示できない

#3

投稿記事 by saba » 12年前

create関数の第三引数(spriteSizeX)と第四引数(spriteSizeY)に値を代入して矩形の大きさを指定します

コード:

bufferID = sprite.create(gl,res,32,32,bitmap);
 
描画するための関数にも同じ値を入れます(第六引数と第七引数)

コード:

sprite.draw(gl,0,448,0,0,32,32,textureSizeX,textureSizeY,scaleX,scaleY,0,bufferID);
 
画像
http://kie.nu/1fhk

一番最後(今は二番目)に前と違う大きさの矩形を生成すると前に生成した画像の大きさも変わってしまいます

コード:

//spriteSizeXを64にして生成
bufferID2 = sprite.create(gl,res,64,32,bitmap2);
sprite.draw(gl,0,416,0,0,64,32,textureSizeX,textureSizeY,scaleX,scaleY,0,bufferID2);
 
画像
http://kie.nu/1fhn

Bのテクスチャが二枚分表示されていますがテクスチャ用画像の解像度が小さいので正常です
テクスチャ用画像の解像度を変えればちゃんと表示されます

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: opengl esでいろいろな大きさの矩形を表示できない

#4

投稿記事 by ISLe » 12年前

36,37行目の
gl11.glVertexPointer(2, GL10.GL_FLOAT,4*4, 0);
gl11.glTexCoordPointer(2, GL10.GL_FLOAT, 4*4, 4*2);

80,81行目のあいだに移動してください。

saba

Re: opengl esでいろいろな大きさの矩形を表示できない

#5

投稿記事 by saba » 12年前

おかげでイメージ通りに描画できました
ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る