openGLを使用して2D(Canvas)を描画する方法

1,109 views
Skip to first unread message

android....@gmail.com

unread,
Apr 13, 2009, 4:55:20 AM4/13/09
to Android-SDK-Japan
Android SDK WG 第2回 セッションで使用されたサンプルを
使用してopenGLの勉強をしているのですが。

3Dと2Dの描画が上手く出来ませんでした。
SurfaceHolder.lockCanvas();
を呼ぶと
-----------------------------------------------------------------------------------
eLocked set when entering lock_layer(), layer=1 (lcblk=0x410140a0),
state=00000020
-----------------------------------------------------------------------------------
表示されました。
うまくlockが出来ません。

どうしたらCanvasで描画が出来るのでしょうか?

kambayashi

unread,
Apr 14, 2009, 2:44:00 PM4/14/09
to Android-SDK-Japan
神林と申します。

おっしゃっているサンプルは私の作ったものだと思うのですが、
createSurface()内のeglCreateWindowSurfaceを呼ぶ前後で
canvas.lockCanvas()の戻り値が変わっていることを確認しました。
内部実装を見ていないので分かりませんが、
eglCreateWindowSurfaceに引数でSurfaceHolderを渡した後、
メソッド内ですでにlockCanvasを呼んでいるんですかね・・・

このサンプルを作ったときよりさらに前のバージョンでは、
OpenGLの機能を使いつつCanvasも使えたと思うんですが、
もしかしたら同時には使えなくなってしまったんでしょうか。

とりあえず結局解決法はわかりませんでした。すみません。
あとは私もどなたかが海外サイトから解決法を拾ってきてくれるのを期待しています。

# 返答を書いた後で考えた適当な案ですが、
# eglCreateWindowSurfaceとeglDestroySurfaceを毎フレーム呼ぶようにして、
# その後にlockCanvasを呼ぶようにすれば一応回避できそうですね。
# 試してもいないですし、深く考えてもいないので試す価値すらないかもしれませんが・・・

On 4月13日, 午後5:55, "android.19820...@gmail.com" <android.


19820...@gmail.com> wrote:
> Android SDK WG 第2回 セッションで使用されたサンプルを
> 使用してopenGLの勉強をしているのですが。
>
> 3Dと2Dの描画が上手く出来ませんでした。
> SurfaceHolder.lockCanvas();
> を呼ぶと

> ---------------------------------------------------------------------------­--------


> eLocked set when entering lock_layer(), layer=1 (lcblk=0x410140a0),
> state=00000020

> ---------------------------------------------------------------------------­--------
> 表示されました。
> うまくlockが出来ません。
>
> どうしたらCanvasで描画が出来るのでしょうか?

Makoto Anjo

unread,
Apr 15, 2009, 1:57:39 AM4/15/09
to Android-SDK-Japan
安生です。

具体的にどのコードを指しているのかよくわからないので詳細な事は言えないのですが、
少なくともCanvasをSurfaveView上で扱うことはできます。

eglとのミックスに関しては試していないのでわかりませんが。
(同時に使うメリットがあるのか?とかは置いておくとして)

神林 篤

unread,
Apr 15, 2009, 10:27:53 AM4/15/09
to android-...@googlegroups.com
神林です。

>安生さん

サンプルに関しては、Android SDK WG 第2回ということなので、
日本androidの会にある以下のページのものではないかと思います。
OpenGLのサンプルに関しては初期化等の構造は全て同じです。
http://android.siprop.org/index.php?%CA%D9%B6%AF%B2%F1%2FAndroid%20SDK%20WG%20%C2%E82%B2%F3%20%A5%BB%A5%C3%A5%B7%A5%E7%A5%F3%A1%CA2008.11.29%A1%CB

それと同時に使うメリットがあるのか?という点でお聞きしたいのですが、
私が考えているものとして以下のようなものがあります。

・扱いやすい2D描画インターフェース
・drawText()での文字列描画(これだけのためといっても過言ではないです)

上記のようなものがあると考えていますが、
特に後者の文字列描画に関して代替機能はあるんでしょうか?

2009/04/15 14:57 Makoto Anjo <tenn...@gmail.com>:

Kenichi Takahashi

unread,
Apr 15, 2009, 11:54:57 PM4/15/09
to android-...@googlegroups.com
高橋です。

> ・drawText()での文字列描画(これだけのためといっても過言ではないです)
>
> 上記のようなものがあると考えていますが、
> 特に後者の文字列描画に関して代替機能はあるんでしょうか?

ApiDemos にある SpriteText では文字列をテクスチャに展開して
OpenGL ES の中で描画しています。描画パフォーマンスの観点
からすると、この方法が良いということになると思います。

少々手間は掛かりますが、
com.example.android.apis.graphics.spritetext の下の
LabelMaker.java の中を覗いてみると、

・Bitmap から Canvas を作成
・Canvas.drawText で文字列を Bitmap に描画
・GLUtils.texImage2D で Bitmap を GL のテクスチャとしてロード
・GL11EXT.glDrawTexiOES でテクスチャを 2D 描画

という流れになっています。

# egl と Canvas のミックスは私も未検証です...。


2009/04/15 23:27 神林 篤 <kamba...@gmail.com>:

--
------------------:-)
Kenichi Takahashi

神林 篤

unread,
Apr 16, 2009, 9:17:01 AM4/16/09
to android-...@googlegroups.com
神林です。

APIDemosのSpriteTextを確認してみました。
http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/graphics/spritetext/index.html

相変わらずOpenGLは文字列に優しくなさそうですね…。

2009/04/16 12:54 Kenichi Takahashi <ken1.ta...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages