« | トップページ | »

2010.12.16

「ProcessingでOpenGLを使う」No.5 配列要素のリスト間接参照

001



牛歩並みに地道に進めているOpenGLの勉強。
GLSLの自作が目的なので、今はめまいがするほど先が長く、へばりそう。参考書が800ページもあるのが痛いなぁ。

前回まで配列を使うこと( glArrayElement() )に成功したのですが、その次のglDrawElements()が成功しない。なぜか画面が真っ黒くなってしまう。

参考書いわく、

「glDrawElements()を実行すると幾つかのステートが不確定のまま残る〜」

とあります。カラー情報とかって不確定になっちゃうって事?
そんな風に思っていたのですが、原因は簡単で、引数の型をbyteにしていました。
Cで書かれたコードをprocessingに書き換えながらやるからかな?小さな事で躓く。┐(´-`)┌


  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_04 extends PApplet{
  14.  
  15.     private static final long serialVersionUID = 1L;
  16.  
  17.     PGraphicsOpenGL pgl;
  18.  
  19.     final int vertice[] = new int[]{25, 25, 100, 325, 175, 25, 175, 325, 250, 25, 325, 325};
  20.     final float color[] = new float[]{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.     static int frontIndices[] = new int[]{4, 5, 6, 7};
  22.     static int rightIndices[] = new int[]{1, 2, 6, 5};
  23.     static int bottomIndices[] = new int[]{0, 1, 5, 4};
  24.     static int backIndices[] = new int[]{0, 3, 2, 1};
  25.     static int leftIndices[] = new int[]{0, 4, 7, 3};
  26.     static int topIndices[] = new int[]{2, 3, 7, 6};
  27.  
  28.     public void setup(){
  29.         size(400,400,OPENGL);
  30.         background(0);
  31.  
  32.         pgl = (PGraphicsOpenGL) g;
  33.         gl = pgl.gl;
  34.     }
  35.  
  36.     public void draw(){
  37.  
  38.         pgl.beginGL();
  39.  
  40.         gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
  41.         gl.glEnableClientState(GL.GL_COLOR_ARRAY);
  42.         gl.glColorPointer(3, GL.GL_FLOAT, 0, makeFloatBuffer(color));
  43.         gl.glVertexPointer(2, GL.GL_INT, 0, makeFloatBuffer(vertice));
  44.  
  45.         gl.glDrawElements(GL.GL_QUADS, 4, GL.GL_UNSIGNED_INT, makeFloatBuffer(frontIndices));
  46.         gl.glDrawElements(GL.GL_QUADS, 4, GL.GL_UNSIGNED_INT, makeFloatBuffer(rightIndices));
  47.         gl.glDrawElements(GL.GL_QUADS, 4, GL.GL_UNSIGNED_INT, makeFloatBuffer(bottomIndices));
  48.         gl.glDrawElements(GL.GL_QUADS, 4, GL.GL_UNSIGNED_INT, makeFloatBuffer(backIndices));
  49.         gl.glDrawElements(GL.GL_QUADS, 4, GL.GL_UNSIGNED_INT, makeFloatBuffer(leftIndices));
  50.         gl.glDrawElements(GL.GL_QUADS, 4, GL.GL_UNSIGNED_INT, makeFloatBuffer(topIndices));
  51.  
  52.  
  53.         /////////////////////////////////////////
  54. //      gl.glBegin(GL.GL_TRIANGLES);
  55. //      gl.glArrayElement(2);
  56. //      gl.glArrayElement(3);
  57. //      gl.glArrayElement(5);
  58. //      gl.glEnd();
  59.         /////////////////////////////////////////
  60.  
  61.         pgl.endGL();
  62.     }
  63.  
  64.     public static FloatBuffer makeFloatBuffer(float[] arr) {
  65.         ByteBuffer bb=ByteBuffer.allocateDirect(arr.length*4);
  66.         bb.order(ByteOrder.nativeOrder());
  67.         FloatBuffer fb=bb.asFloatBuffer();
  68.         fb.put(arr);
  69.         fb.position(0);
  70.         return fb;
  71.     }
  72.  
  73.     public static IntBuffer makeFloatBuffer(int[] arr) {
  74.         ByteBuffer bb=ByteBuffer.allocateDirect(arr.length*4);
  75.         bb.order(ByteOrder.nativeOrder());
  76.         IntBuffer ib=bb.asIntBuffer();
  77.         ib.put(arr);
  78.         ib.position(0);
  79.         return ib;
  80.     }
  81. }
  82.  



GLUTによるOpenGL入門 GLUTによるOpenGL入門
「OpenGL Utility Toolkit」で簡単3Dプログラミング!


価格 : ¥ 1,995(税込み)

「手抜き」で楽々入門!OpenGLにGLUTを組み合わせれば、リアルタイム3D‐CGプログラムが簡単に書ける。

|

« | トップページ | »

processing」カテゴリの記事

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: 「ProcessingでOpenGLを使う」No.5 配列要素のリスト間接参照:

« | トップページ | »