OpenGLでの文字描画

2,457 views
Skip to first unread message

テーシィー

unread,
Nov 25, 2012, 10:26:59 AM11/25/12
to android-g...@googlegroups.com

OpenGLでは直接文字表示ができないらしいので文字を画像として
貼りたいのですがそのプログラム貼り付けます。
テクスチャとオブジェクトの関連付のみでほかは省略します。

gl10.glClear(GL10.GL_COLOR_BUFFER_BIT); //GL10のインスタンスのgl10は初期化済み
gl10.glEnable(GL10.GL_TEXTURE_2D);
gl10.glEnable(GL10.GL_BLEND);
gl10.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
int[] textureIds=new int[1];
gl10.glGenTextures(1,textureIds,0);
int textureId=textureIds[0];

Bitmap bitmap=Bitmap.createBitmap(512,512,Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(bitmap);
canvas.drawARGB(0, 0, 0, 0); //文字の画像の背景を透明にする
Paint paint=new Paint();
paint.setColor(Color.BLACK);
paint.setTextSize(30);
canvas.drawText(text,canvas.getWidth()/2,170,paint);

gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureId);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bitmap,0);

gl10.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
gl10.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST);
bitmap.recycle();
gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);

gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureId);
gl10.glColor4f(0,0,0,alpha); //alphaは時間が経つたびに減っていく


//これよりあとは描画作業

最後のglColor4fは文字の画像全体を最初は透明にし時間が経つたびにalphaを減らしていき文字が浮かび上がるような感じにするためです。
このプログラムだとこの画像を描画した部分だけ白く表示されます。
どのへんがあやしいですか?
自分的にはglcolor4f()かdrawARGB()あたりだと思うのですが。

Hirokazu Fukami

unread,
Nov 25, 2012, 10:30:45 AM11/25/12
to android-g...@googlegroups.com
こんにちはfkmです。

アプリ内で動的にbitmapを作成していますが、もしこれをリソースから読み込む方法に変更した際、
ちゃんとテクスチャーが貼れた状態で描画されるか確認してみましたか?


2012/11/26 テーシィー <tnoky...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/fpE-9BIE0_sJ
> にアクセスしてください。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

テーシィー

unread,
Nov 25, 2012, 10:42:02 AM11/25/12
to android-g...@googlegroups.com
リソースに入っている普通(文字描画したものではない)の画像はちゃんと描画されますが
fkmさんがいうのは上のプログラムで画像を作りそれをリソースに入れてそこから読み込み描画するということですか?

田代透

unread,
Nov 25, 2012, 10:47:39 AM11/25/12
to android-g...@googlegroups.com
1.プログラム中で作成しているテクスチャとして使うBitmapは期待通りに作成できていますか?
2.作成されたBitmapは正しくテクスチャとして登録されていますか?
3.プログラムはテクスチャを正しく利用していますか?

2012年11月26日 0:42 テーシィー <tnoky...@gmail.com>:
リソースに入っている普通(文字描画したものではない)の画像はちゃんと描画されますが
fkmさんがいうのは上のプログラムで画像を作りそれをリソースに入れてそこから読み込み描画するということですか?

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/BrS3n1ehrWQJ にアクセスしてください。

このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。



--
--
Toru Tashiro
toru...@gmail.com

Hirokazu Fukami

unread,
Nov 25, 2012, 10:52:22 AM11/25/12
to android-g...@googlegroups.com
fkmです。

2012/11/26 テーシィー <tnoky...@gmail.com>:
>> リソースに入っている普通(文字描画したものではない)の画像はちゃんと描画されますが
>> fkmさんがいうのは上のプログラムで画像を作りそれをリソースに入れてそこから読み込み描画するということですか?

描画部分のコードが正しいかを確認したかったので、質問してみました。
描画部分のコードが間違っていると、リソースに入っている画像を使っても真っ白になるはずなので。

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/BrS3n1ehrWQJ
> にアクセスしてください。
>
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。



--

テーシィー

unread,
Nov 25, 2012, 11:36:49 AM11/25/12
to android-g...@googlegroups.com
1は
 
createBitmap()で512×512のBitmapを作りCancasクラスを使い最初にBitmap全体を透明にして文字を描画していきました。
 
おそらくこの辺のプログラムは他のサイトをみてチェックしたので間違いはないと思います。
 
 
2は
 
texImage2D()で1で説明したBitmapをテクスチャオブジェクトと関連付けしているし
texImage2D()の前にもglBindTexture()もよんでいるので大丈夫だと思います
 
 
3は
 
描画するときにきちんと利用されているという意味でよろしいでしょうか?
その意味ならリソース元から他の画像を読み込んで画像を描画する場合問題ないので描画部分の「プログラム自体は大丈夫なのでしょうが
実際白く表示されるというとはやはりこのテクスチャの関連付けの部分が問題ありなのだと思います。
 

Hirokazu Fukami

unread,
Nov 25, 2012, 11:41:35 AM11/25/12
to android-g...@googlegroups.com
こんばんはfkmです。

ぼんやりソースを眺めてたら不自然なところに気づきました

gl10.glColor4f(0,0,0,alpha);

確かここって、描画する画像を徐々に透明にする場合は

float alpla = 1.0f;
gl10.glColor4f(1.0f, 1.0f, 1.0f, alpha);
な感じで、前3つは1.0fで指定しないと全部の色が抜けちゃう気がしました。


2012/11/26 テーシィー <tnoky...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/Z1XrET5h4a8J
> にアクセスしてください。
>
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。



--

テーシィー

unread,
Nov 25, 2012, 12:23:39 PM11/25/12
to android-g...@googlegroups.com
すみませんさっき書いたプログラムにはglColor4fが書いてありましたが実際動かす方には書いてありませんでした。
 
というわけでglColor4f()がないプログラムでは文字の画像の部分だけが真っ白になります。
 
しかしglColor4f()を入れてみると文字の画像だけではなく画面全体が黒くなりました。
引数を1にしても0にしても変わりませんでした。 
 
文字の画像の部分だけ徐々に出るよう(透明→不透明)にするには他に何か使える関数がありますか?

田代透

unread,
Nov 25, 2012, 12:46:38 PM11/25/12
to android-g...@googlegroups.com
1.間違いはないと思います。
2.大丈夫だと思います

 「思います」ではなくて確認してみたほうがよいでしょう。

 テクスチャ自体がちゃんとできていて、テクスチャを正しく設定してあって、テクスチャを正しく使っていれば表示されるでしょう。
 段階的に透明から不透明にするではなく、最初から不透明で表示した場合にはちゃんと表示できますか?

2012年11月26日 2:23 テーシィー <tnoky...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/amsnNwDzRP8J にアクセスしてください。

このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。



--
--
Toru Tashiro
toru...@gmail.com

kacodama

unread,
Nov 26, 2012, 12:56:54 AM11/26/12
to android-g...@googlegroups.com
1.まず、アルファの変更をやめてすべて不透明にし、背景を黒以外の任意の分かりやすい色にして、
ベタ一枚のBitmapがテクスチャとしてちゃんと出ているか確認する
⇒NGならBitmap、canvas、テクスチャの設定がおかしい(テクスチャ座標も合ってますか?)

2.文字の描画ができているか確認する
⇒NGならテキストの描画コード、テクスチャ関連の設定がおかしい

2.背景のアルファ値だけを0に変更して「抜き」ができているか確認する
⇒NGならアルファ関連、テクスチャ関連の設定、描画順がおかしい

3.テキストのアルファを変更してみて半透明になるか確認する
⇒NGならアルファ関連、テクスチャ関連の設定、描画順がおかしい

4.テキストのアルファを動的に変更して確認する
⇒NGならアルファの計算がおかしい

こんなステップを踏んで確認してみると良いかと思います。

2012年11月26日月曜日 0時26分59秒 UTC+9 テーシィー:

MORIHIRO

unread,
Nov 26, 2012, 7:49:41 AM11/26/12
to android-g...@googlegroups.com
OpenGLで文字列表示ということであれば、ApiDemosのSpriteTextのコードと
比較してみれば問題点が分かるかもしれません。

ちなみに、SpriteTextでColor4f()を追加してみたら透過処理ができました。
→ LabelMaker.java の draw()メソッド

2012年11月26日月曜日 0時26分59秒 UTC+9 テーシィー:

あの、なかしま

unread,
Nov 29, 2012, 8:33:27 PM11/29/12
to android-g...@googlegroups.com
ソースに問題はないと思います。
もし描画されないのであれば端末依存の可能性もありそうです。
私の環境では、下記のコードで動作しました。

public class MyRenderer implements Renderer {

public void onSurfaceCreated(GL10 gl10, EGLConfig config) {}


public void onSurfaceChanged(GL10 gl10, int width, int height) {}


float alpha = 1.0f;

public void onDrawFrame(GL10 gl10) {

gl10.glClear(GL10.GL_COLOR_BUFFER_BIT);

gl10.glEnable(GL10.GL_TEXTURE_2D); 

gl10.glEnable(GL10.GL_BLEND); 

gl10.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 

int[] textureIds=new int[1]; 

gl10.glGenTextures(1,textureIds,0); 

int textureId=textureIds[0]; 


Bitmap bitmap=Bitmap.createBitmap(512,512,Bitmap.Config.ARGB_8888); 

Canvas canvas=new Canvas(bitmap); 

canvas.drawARGB(0, 0, 0, 0);

Paint paint=new Paint(); 

paint.setColor(Color.BLACK); 

paint.setTextSize(30); 

canvas.drawText("サンプル",canvas.getWidth()/2,170,paint);


gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureId); 

GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bitmap,0); 


gl10.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST); 

gl10.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST); 

bitmap.recycle(); 

gl10.glBindTexture(GL10.GL_TEXTURE_2D, 0); 


gl10.glBindTexture(GL10.GL_TEXTURE_2D,textureId); 

gl10.glColor4f(0,0,0,alpha);

alpha -= 0.1f;

if (alpha < 0) alpha = 1.0f;

gl10.glClearColor(0.0f, 1.0f, 1.0f, 1.0f);

gl10.glClear(GL10.GL_COLOR_BUFFER_BIT);

float uv[] = { 0.0f, 0.0f,

0.0f, 1.0f,

1.0f, 0.0f,

1.0f, 1.0f,

};

ByteBuffer bba = ByteBuffer.allocateDirect(uv.length * 4);

bba.order(ByteOrder.nativeOrder());

FloatBuffer fbuv = bba.asFloatBuffer();

fbuv.put(uv);

fbuv.position(0);

gl10.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl10.glTexCoordPointer(2, GL10.GL_FLOAT, 0, fbuv);

float positions[] = {

-1.0f, 1.0f, 0.0f,

-1.0f, -1.0f, 0.0f,

1.0f, 1.0f, 0.0f,

1.0f, -1.0f, 0.0f,

};


ByteBuffer bbb = ByteBuffer.allocateDirect(positions.length * 4);

bbb.order(ByteOrder.nativeOrder());

FloatBuffer fb = bbb.asFloatBuffer();

fb.put(positions);

fb.position(0);


gl10.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl10.glVertexPointer(3, GL10.GL_FLOAT, 0, fb);

gl10.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

}

}


2012年11月26日月曜日 0時26分59秒 UTC+9 テーシィー:

テーシィー

unread,
Dec 8, 2012, 1:56:56 AM12/8/12
to android-g...@googlegroups.com
自分は外部プロジェクトのフレームワークを使ってテクスチャの関連付けや描画部分を行っているのですが
 
Bitmap bitmap=Bitmap.createBitmap(512,512,Bitmap.Config.ARGB_8888);
 
これをフレームワーク側で行うとダメっだったりしますかね?
 
あと自動では削除されないようなのでglDeleteTextures()を行うのですがこれはBitmap.recycle()のところあたりですれば良いですよね?

テーシィー

unread,
Dec 10, 2012, 11:09:32 AM12/10/12
to android-g...@googlegroups.com
やはりBitmapで文字のテクスチャを作った部分が真っ白に表示されるのですがOpenGLをAndroidで使う場合、
 画面が白くなるのはどういった原因が考えられますか?
サイズを2のべき乗にすべきなのはクリアしてます。

kacodama

unread,
Dec 10, 2012, 7:55:15 PM12/10/12
to android-g...@googlegroups.com
透過合成の設定がうまく行っていないのでは?
あとは描画順ですね。最初に手前に文字を書いていると、文字の奥に何も描画できませんから透過できていないように見えます。

>Bitmap bitmap=Bitmap.createBitmap(512,512,Bitmap.Config.ARGB_8888); 
>Canvas canvas=new Canvas(bitmap); 
>canvas.drawARGB(0, 0, 0, 0); //文字の画像の背景を透明にする 
>Paint paint=new Paint(); 
>paint.setColor(Color.BLACK); 
>paint.setTextSize(30); 
>canvas.drawText(text,canvas.getWidth()/2,170,paint);

これで書いた文字がα抜きできていることは確認済みですか?
OpenGLではなく、通常のSurfaceViewで描いたらどうなりますか?
見た目的には大丈夫そうですけど・・・


2012年12月11日火曜日 1時09分32秒 UTC+9 テーシィー:
やはりBitmapで文字のテクスチャを作った部分が真っ白に表示されるのですがOpenGLをAndroidで使う場合、
 画面が白くなるのはどういった原因が考えられますか?
サイズを2のべき乗にすべきなのはクリアしてます。

あの、なかしま

unread,
Jan 7, 2013, 4:49:14 AM1/7/13
to android-g...@googlegroups.com
GLThread以外でテクスチャの関連付けを行う事はできません。
おそらく、LogCatにエラーログが出ているはずです。

2012年12月8日土曜日 15時56分56秒 UTC+9 テーシィー:
Reply all
Reply to author
Forward
0 new messages