2011.11.17

【Android NDK】OpenGLへ手を出してみる

やっと、OpenGLを触ってもいいかなという状況までくることができました。

大まかな流れ

やり方こんな感じらしい。
Link:Androidプログラミング-NDK-OpenGL - tueda
JavaでのOpenGLをやってたときの関数をそのままJNI経由でC言語へ渡すだけらしい。

引数でもらうglって変数も必要なく通常のC言語のOpenGLと同じ方式で記述できる。

Java側のOpenGLをある程度知っていたのでので移植もそれなりに簡単でした。

描画方法

Javaで使っていたFloatBufferの乗りでglBufferDataでデータを転送するのがよいらしい。

glColorPointerなどの第四引数にデータを指定する関数をメモリから
そのまま転送する方法をやっていたのだけどうまくいかなかった。

Javaで行っていたFloatBufferのようにglBufferDataを使いOpenGL監理下のメモリへ転送した上で
処理を行うとうまくいきました。

//頂点インデックス以外はGL_ARRAY_BUFFERで確保すればよいらしい。
glGenBuffers( 1, g_nUvBufferId );
glBindBuffer( GL_ARRAY_BUFFER, g_nUvBufferId[0] );
glBufferData( GL_ARRAY_BUFFER, sizeof( g_fUvBuffer ), g_fUvBuffer, GL_STATIC_DRAW );

// ...処理...

glBindBuffer( GL_ARRAY_BUFFER, g_nUvBufferId[0] );
//第四引数を0にすると事前にglBindBufferに指定したものをデータとして扱うぽい。
glTexCoordPointer( 2, GL_FLOAT, 0, 0 );

こういう方式にしたほうがOpenGLで描画するときも早くなるのでいいことではないかな?

glTexImage2Dの変数書き換え?

Java側でGLUtils.texImage2Dを使用し画像を転送する際、一部のOpenGLの情報が
書き換えられていて描画がうまくいかないことがありました。

これはJavaのせいなのかと思っていましたがどうもCで書いても起こっているっぽいです。

なのでこんな感じに再設定しなおすように書いています。

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, g_Info.nWidth, g_Info.nHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, g_Info.pPixel );

//なぜか変更されるので元に戻す
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

これは機種依存なんでしょうかね?
ちなみに機種はGalaxy S2です。


glBindBuffer系の流れがわかったことでだいぶOpenGLが見えてきましたね。
さらに内容を詰めて行きたいところです。

Android NDKネイティブプログラミング Android NDKネイティブプログラミング
出村 成和

秀和システム 2011-07
売り上げランキング : 76394

Amazonで詳しく見る by G-Tools

ニャッキ格闘列伝 > プログラム >

前の記事:
次の記事:

関連記事

コメントリスト

コメントなし

コメント



*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

こんなタグが使えるみたいよ:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>