Android OpenGL を用いたフレームバッファの使い方

2,149 views
Skip to first unread message

菊地 俊

unread,
Sep 13, 2011, 4:14:44 AM9/13/11
to 日本Androidの会
お世話になります。
菊地と申します。

現在 GLSurfaceView を用いて描画を行っております。
素材を iPhone と共通にしたいので

オフスクリーン(320x400) に描画
→ オフスクリーンを解像度にあわせて引き伸ばして描画

上記のような処理を実現したいと思っております。

//-------------------------------------------------
// 描画
public void onDrawFrame( GL10 gl )
{
GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

// オフスクリーン
gl11ep.glBindFramebufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES,
mFramebuffer );
drawOffscreenImage( gl, 320, 400 );

// オンスクリーン
gl11ep.glBindFramebufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES,
0 );
drawOnscreen( gl, width, height );
}


// フレームバッファ作成
private void createFramebuffer( GL10 gl, int width, int height, int
textureId )
{
GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

int[] framebuffers = new int[1];
int[] colorbuffers = new int[1];
int[] depthbuffers = new int[1];

gl11ep.glGenFramebuffersOES( 1, framebuffers, 0 );
gl11ep.glGenRenderbuffersOES( 1, colorbuffers, 0 );

gl11ep.glBindFramebufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES,
framebuffers[0] );

gl11ep.glBindRenderbufferOES( GL11ExtensionPack.GL_RENDERBUFFER_OES,
colorbuffers[0] );


gl11ep.glFramebufferRenderbufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES,
GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES,
GL11ExtensionPack.GL_RENDERBUFFER_OES, colorbuffers[0] );

gl11ep.glGenRenderbuffersOES( 1, depthbuffers, 0 );

gl11ep.glBindRenderbufferOES( GL11ExtensionPack.GL_RENDERBUFFER_OES,
depthbuffers[0] );


gl11ep.glRenderbufferStorageOES( GL11ExtensionPack.GL_RENDERBUFFER_OES,
GL11ExtensionPack.GL_DEPTH_COMPONENT16, width, height );

gl11ep.glFramebufferRenderbufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES,
GL11ExtensionPack.GL_DEPTH_ATTACHMENT_OES,
GL11ExtensionPack.GL_RENDERBUFFER_OES, depthbuffers[0] );

int status =
gl11ep.glCheckFramebufferStatusOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES );
if( status != GL11ExtensionPack.GL_FRAMEBUFFER_COMPLETE_OES )
{
throw new RuntimeException("Framebuffer is not complete: " +
Integer.toHexString(status));
}


mFramebuffer = framebuffers[0];
}
//-------------------------------------------------


Web などで調べてこのような形になりましたが
glCheckFramebufferStatusOES で
GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES が返ってきてしまいます。

何か解決法がありましたらご教示頂けると幸いです。
よろしくお願い致します。


----
Android 2.3 で開発

ohisamallc

unread,
Sep 13, 2011, 8:52:02 PM9/13/11
to android-g...@googlegroups.com
山形のohisamaです。
山形では、菊、食べます。
がんばろう、東北。

自分の
HT-03aでは、GL_FRAMEBUFFER_OESは
サポートされてませんので、あれですが
カラーバッファに、glFramebufferTexture2DOES
を使用されては、いかがでしょう。

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られ

> います。
> このグループに投稿するには、android-g...@googlegroups.com にメール

> 送信してください。
> このグループから退会するには、
> android-group-j...@googlegroups.com にメールを送信してくださ

> 。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja

> らこのグループにアクセスしてください。
>
>
>

菊地 俊

unread,
Sep 15, 2011, 1:31:31 AM9/15/11
to 日本Androidの会
ご回答ありがとうございます。

大変申し訳ないのですが、私の GL 勉強不足がゆえ
せっかくのご指摘ををどう昇華すればいいのかわかりません。

日々精進してまいりますが
具体的にどのように記述すればよろしいのでしょうか。


また、各 GL の関数に glGetError() を挟んだところ
>gl11ep.glGenFramebuffersOES( 1, framebuffers, 0 );
最初の一文のみ GL_INVALID_VALUE 0x501 が返ってきています。
> > らこのグループにアクセスしてください。- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

ohisamallc

unread,
Sep 15, 2011, 2:07:34 AM9/15/11
to android-g...@googlegroups.com
山形のohisamaです。
山形は、今日も秋晴れです。
がんばろう、東北。

それって、最初に、extensionsを調べて
GL_OES_framebuffer_objectあたりが
無いと、、、、

宣伝
自分のアプリ「Another System info」で
extensionsは、見れます。(有料)

菊地 俊

unread,
Sep 15, 2011, 2:35:43 AM9/15/11
to 日本Androidの会
素早い返信ありがとうございます。
菊地です。

checkIfContextSupportsExtension( gl, "GL_OES_framebuffer_object" );
上記のチェックは行っております!

今、ターゲットとなるテクスチャが 2 の乗数ではなかったので 512x512 で生成した所
エラーがなくなり、期待の動作ができました。
(なぜかオフスクリーンの描画領域が半分になってしまいますが…)

少し整理してみます。

菊地 俊

unread,
Sep 15, 2011, 5:16:35 AM9/15/11
to 日本Androidの会
お世話になっております。
菊地です。

半分しか描画されないのは glViewPort なので設定でした。
結局一つ前の投稿にもある通り、テクスチャが 2 の乗数でなかったのが主な原因でした。
# おはずかしい・・・

ohisamaさん、お付き合いありがとうございました。
私も地元は東北岩手でございました!


//----
// 最終コード
// (見辛いので GL11ExtensionPack → GL11E に補完してください。。
//----
private int createFrameBuffer( GL10 gl, int width, int height, int
targetTextureId )
{
GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

int[] framebuffers = new int[1];
int[] colorbuffers = new int[1];
int[] depthbuffers = new int[1];

gl11ep.glGenFramebuffersOES( 1, framebuffers, 0 );
gl11ep.glGenRenderbuffersOES( 1, colorbuffers, 0 );

gl11ep.glBindFramebufferOES( GL11E.GL_FRAMEBUFFER_OES,
framebuffers[0] );
gl11ep.glBindRenderbufferOES( GL11E.GL_RENDERBUFFER_OES,
colorbuffers[0] );

gl11ep.glFramebufferRenderbufferOES( GL11E.GL_FRAMEBUFFER_OES,
GL11E.GL_COLOR_ATTACHMENT0_OES, GL11E.GL_RENDERBUFFER_OES,
colorbuffers[0] );

gl11ep.glGenRenderbuffersOES( 1, depthbuffers, 0 );
gl11ep.glBindRenderbufferOES( GL11E.GL_RENDERBUFFER_OES,
depthbuffers[0] );
gl11ep.glRenderbufferStorageOES( GL11E.GL_RENDERBUFFER_OES,
GL11E.GL_DEPTH_COMPONENT16, width, height );
gl11ep.glFramebufferRenderbufferOES( GL11E.GL_FRAMEBUFFER_OES,
GL11E.GL_DEPTH_ATTACHMENT_OES, GL11E.GL_RENDERBUFFER_OES,
depthbuffers[0] );

gl11ep.glFramebufferTexture2DOES( GL11E.GL_FRAMEBUFFER_OES,
GL11E.GL_COLOR_ATTACHMENT0_OES, GL10.GL_TEXTURE_2D, targetTextureId,
0 );

int status =
gl11ep.glCheckFramebufferStatusOES( GL11E.GL_FRAMEBUFFER_OES );
if( status != GL11E.GL_FRAMEBUFFER_COMPLETE_OES )
{
throw new RuntimeException("Framebuffer is not complete: " +
Integer.toHexString(status));
}

return framebuffers[0];
}

ohisamallc

unread,
Sep 19, 2011, 7:49:45 PM9/19/11
to android-g...@googlegroups.com
山形のohisamaです。
山形は、雨で、めっきり涼しくなりました。
がんばろう、東北。

追っかけ、検証して見ました。
ht-03aでは、残念な結果でしたので、
nec smartia を調達しました。
android2.1updateでextensionsはOK
なのに、javaでだめでした。
結局、ndkで確認しました。


> -----Original Message-----
> From: android-g...@googlegroups.com
> [mailto:android-g...@googlegroups.com]On Behalf Of 菊地 俊
> Sent: Thursday, September 15, 2011 6:17 PM
> To: 日本Androidの会
> Subject: [work] [android-group-japan: 14293] Re: Android OpenGL を用いた
> フレームバッファの使い方
>
>

> --


> このメールは Google グループのグループ「日本Androidの会」の登録者に送られ

> います。
> このグループに投稿するには、android-g...@googlegroups.com にメール

Reply all
Reply to author
Forward
0 new messages