0

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());行を指していますが、間違いが見つかりません...

4

1 に答える 1