初歩からわかるAndroid最新プログラミング初歩からわかる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()に置き換えることで問題なく動くようになりました。