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で描画するときも早くなるのでいいことではないかな?
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ネイティブプログラミング 出村 成和 秀和システム 2011-07 |
関連記事