« 今日の畑 | トップページ | 銀粘土 - 5作品目 »

2010.11.29

「ProcessingでOpenGLを使う」No.4 配列を使う

地道に進めていた、OpenGLですが、ここ数日サンプルプログラムの実行に大ブレーキが掛かっていました。
参考書を読み進める事は容易でしたが、サンプルプログラムを実行すると必ず下記のエラーが出るようになり、その原因も不明でした。

「Argument "ptr" was not a direct buffer」

アギューメント“ptr”?? バッファが直接的でない??

問題となったメソッドは、

  gl.glColorPointer(3, GL.GL_FLOAT, 0, colors);
  gl.glVertexPointer(2, GL.GL_INT, 0, vertices);


最後の引数がbytebufferでないといけないようだから、配列を、

  final FloatBuffer colors = FloatBuffer.wrap(color);
  final IntBuffer vertices = IntBuffer.wrap(vertice);


で、bytebufferにしてみたつもりだけど、これが原因のようだった。

ダイレクトバッファと非ダイレクトバッファ

なるほど、java.nioのBufferについて全く知らなかった僕の無知がいけなかったのだ。
要するに、必ずallocateDirect()で作らなきゃだめなんだね、
ということで、gl.glColorPointer()で検索掛けてみて引数の先を確認してみると、下記のサイトに便利なクラスがあったので、借りて改めてテストした結果、見事、配列より描画することが出来た。

Androidメモ

配列の内容が適当なのでおかしな図形ですが、これで無事、先に進むことが出来る。一時はprocessingでは出来ないのかと考えていたので良かった。

001



  1. package openGL;
  2.  
  3. import java.nio.ByteBuffer;
  4. import java.nio.ByteOrder;
  5. import java.nio.FloatBuffer;
  6. import java.nio.IntBuffer;
  7.  
  8. import processing.core.*;
  9. import processing.opengl.*;
  10. import javax.media.opengl.*;
  11.  
  12.  
  13. public class OpenGL_Array_Test_00 extends PApplet{
  14.  
  15.     private static final long serialVersionUID = 1L;
  16.  
  17.     PGraphicsOpenGL pgl;
  18.  
  19.     final int vertice[] = new int[]{0, 0, 25, 25, 100, 325, 175, 25, 175, 325, 250, 25, 325, 325};
  20.     final float color[] = new float[]{0f, 0f, 0f, 1.0f, 0.2f, 0.2f, 0.2f, 0.2f, 0.1f, 0.8f, 1.0f, 0.2f, 0.75f, 0.75f, 0.75f, 0.35f, 0.35f, 0.35f, 0.5f, 0.5f, 0.5f};
  21.  
  22. //  final IntBuffer vertices = IntBuffer.allocate(vertice.length);
  23. //  final FloatBuffer colors = FloatBuffer.wrap(color);
  24. //  final IntBuffer vertices = IntBuffer.wrap(vertice);
  25.  
  26.  
  27.     public void setup(){
  28.         size(400,400,OPENGL);
  29.         background(0);
  30.  
  31.         pgl = (PGraphicsOpenGL) g;
  32.         gl = pgl.gl;
  33.     }
  34.  
  35.     public void draw(){
  36.  
  37.         pgl.beginGL();
  38.  
  39.         gl.glEnableClientState(GL.GL_COLOR_ARRAY);
  40.         gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
  41.         gl.glColorPointer(3, GL.GL_FLOAT, 0, makeFloatBuffer(color));
  42.         gl.glVertexPointer(2, GL.GL_INT, 0, makeFloatBuffer(vertice));
  43.  
  44.         /////////////////////////////////////////
  45.         gl.glBegin(GL.GL_TRIANGLES);
  46.         gl.glArrayElement(2);
  47.         gl.glArrayElement(3);
  48.         gl.glArrayElement(5);
  49.         gl.glEnd();
  50.         /////////////////////////////////////////
  51.  
  52.         pgl.endGL();
  53.     }
  54.  
  55.     public static FloatBuffer makeFloatBuffer(float[] arr) {
  56.         ByteBuffer bb=ByteBuffer.allocateDirect(arr.length*4);
  57.         bb.order(ByteOrder.nativeOrder());
  58.         FloatBuffer fb=bb.asFloatBuffer();
  59.         fb.put(arr);
  60.         fb.position(0);
  61.         return fb;
  62.     }
  63.  
  64.     public static IntBuffer makeFloatBuffer(int[] arr) {
  65.         ByteBuffer bb=ByteBuffer.allocateDirect(arr.length*4);
  66.         bb.order(ByteOrder.nativeOrder());
  67.         IntBuffer ib=bb.asIntBuffer();
  68.         ib.put(arr);
  69.         ib.position(0);
  70.         return ib;
  71.     }
  72. }
  73.  



Processingプログラミング入門 Processingプログラミング入門
Javaベースのオープンソース統合開発環境


価格 : ¥ 3,150(税込み)

本書は、Processingを使うのが初めてという人向けに書かれています。 本書の目的は、Processingを利用して簡単にマルチメディアアプリケーションを作れることと、上級レベルへの橋渡しです。 読者のレベルは、簡単なHTMLやC言語などのプログラムリストを入力できる人を対象としています。。

|

« 今日の畑 | トップページ | 銀粘土 - 5作品目 »

processing」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/198455/50159918

この記事へのトラックバック一覧です: 「ProcessingでOpenGLを使う」No.4 配列を使う:

« 今日の畑 | トップページ | 銀粘土 - 5作品目 »