![]() | 初歩からわかるAndroid最新プログラミング 安生 真,柴田 文彦,藤枝 崇史 インプレスジャパン 売り上げランキング : 326 Amazonで詳しく見る |
初歩からわかるAndroid最新プログラミング
を参考に、OpenGLを使ったGLSurfaceViewで2D描画を行おうとしたものの、Build TargetがAndroid2.1とかだったりすると、記載されたコードと同じではgl.glVertexPointer()あたりから落ちてしまいます。
1.6とか1.5をTargetにしたときは問題ないです。
原因はバッファの場所
2.1とかだと、gl.glVertexPointer()などに渡すバッファ(4番目の引数の部分)はダイレクトバッファである必要があるみたい(1.6とかでは動いていたのは、そのころは非ダイレクトバッファでも良かったのかも?)
サンプルコードでは
gl.glVertexPointer(3, GL10.GL_FIXED, 0, IntBuffer.wrap(vertices));
と記載されているけれど、IntBuffer.wrap()は「非ダイレクト」バッファを確保してくれるだけとのこと。よってこのコードは動かない。
2.1対応の方法
ByteBuffer周りから確保するとダイレクトバッファになるようなので、IntBuffer.wrap()を使わずにそっちを使うことにする。
具体的なコードは
アンドロイドアプリ開発環境構築 CRIMSON Systems - OpenGL ES Sphere1 カラーマッピング
http://www.crimson-systems.jp/android/android07.php
に書かれていた、
public static IntBuffer makeIntBuffer(int vertices[]) { ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length*4); byteBuffer.order(ByteOrder.nativeOrder()); IntBuffer ib = byteBuffer.asIntBuffer(); ib.put(vertices); ib.position(0); return ib; }
を使わせてもらい、IntBuffer.wrap()の部分をmakeIntBuffer()に置き換えることで問題なく動くようになりました。
ありがとうございます。