VBO (VertexBufferObjects) の処理方法を学習しようとしていますが、Vertex Arrays よりも先に進むことができません。このトピックに関するいくつかの基本的なチュートリアルに従いましたが、それぞれが異なる方法を教えていたため、理解して実装するのが難しくなりました.
問題: でのレンダリングglDrawArrays();
は、即時モードでのレンダリングと同じように機能するはずです。そのため、 songho.caでコードをテストしようとしましたが、ネイティブ コード内で JVM がクラッシュするだけです。このメソッドには数十のバリエーションがあるため、Google に尋ねてもまったく役に立ちませんでした。しかし、私のパラメーターが主な問題であると思います。
これが私がこれまでに得たものです:
私は LWJGL を使用しているので、データを FloatBuffer に格納しています。
FloatBuffer buffer = BufferUtils.createFloatBuffer(triangles.size() * 3 * 3);
for(Triangle tri : triangles) {
buffer.put((float) tri.getA().x);
buffer.put((float) tri.getA().y);
buffer.put((float) tri.getA().z);
buffer.put((float) tri.getB().x);
buffer.put((float) tri.getB().y);
buffer.put((float) tri.getB().z);
buffer.put((float) tri.getC().x);
buffer.put((float) tri.getC().y);
buffer.put((float) tri.getC().z);
}
私の Triangle クラスは 3 つのベクトル ABC で構成され、それぞれが 1 つの頂点を定義します。最初の行では、三角形ごとに 9 つのフロート (頂点ごとに 3 つのフロート、三角形ごとに 3 つの頂点) の頂点にスペースを割り当てています。これまでのところ異常なことは何もありません。バッファ内に配置されたフロートの量は、割り当てられたサイズとまったく同じです。
即時モードでのレンダリング:
glBegin(GL_TRIANGLES);
for (Triangle tri : this.triangles) {
glVertex3d(tri.getA().x, tri.getA().y, tri.getA().z);
glVertex3d(tri.getB().x, tri.getB().y, tri.getB().z);
glVertex3d(tri.getC().x, tri.getC().y, tri.getC().z);
}
glEnd();
特別なことは何もありません。これまでに見たものはすべて、私にとってはうまくいきます。しかし、Array バリアントは頭痛の種です...
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, 0, buffer);
glDrawArrays(GL_TRIANGLES, 0, buffer.capacity());
glDisableClientState( GL_VERTEX_ARRAY );
クラッシュしている JVM によって生成されたエラーログはglDrawArrays(GL_TRIANGLES, 0, buffer.capacity());
行を指していますが、間違いが見つかりません...