0

私は現在、Minecraft のクラシックに似た、立方体の地形を使った基本的なゲームを作ろうとしています。私の最初の質問:

キューブのリストを VBO に保存し、そのデータを変更したときにリストを再構築するにはどうすればよいですか? 現在、次のようにキューブをレンダリングしています。

vertices = BufferUtils.createFloatBuffer(3 * 4 * 6);
    vertices.put(new float[] {
            -1.0f, -1.0f, 1.0f,
            1.0f, -1.0f, 1.0f,
            1.0f, 1.0f, 1.0f,
            -1.0f, 1.0f, 1.0f,

            -1.0f, -1.0f, -1.0f,
            -1.0f, 1.0f, -1.0f,
            1.0f, 1.0f, -1.0f,
            1.0f, -1.0f, -1.0f,

            -1.0f, 1.0f, -1.0f,
            -1.0f, 1.0f, 1.0f,
            1.0f, 1.0f, 1.0f,
            1.0f, 1.0f, -1.0f,

            -1.0f, -1.0f, -1.0f,
            1.0f, -1.0f, -1.0f,
            1.0f, -1.0f, 1.0f,
            -1.0f, -1.0f, 1.0f,

            1.0f, -1.0f, -1.0f,
            1.0f, 1.0f, -1.0f,
            1.0f, 1.0f, 1.0f,
            1.0f, -1.0f, 1.0f,

            -1.0f, -1.0f, -1.0f,
            -1.0f, -1.0f, 1.0f,
            -1.0f, 1.0f, 1.0f,
            -1.0f, 1.0f, -1.0f});
    vertices.rewind();

    vertexBufferID = createVBOID();
    bufferData(vertexBufferID, vertices);

         public static int createVBOID() {
        if (GLContext.getCapabilities().GL_ARB_vertex_buffer_object) {
            IntBuffer buffer = BufferUtils.createIntBuffer(1);
            ARBVertexBufferObject.glGenBuffersARB(buffer);
            return buffer.get(0);
        }
        return 0;
    }

 public static void bufferData(int id, FloatBuffer buffer) {
        ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, id);
        ARBVertexBufferObject.glBufferDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, buffer, ARBVertexBufferObject.GL_DYNAMIC_DRAW_ARB);
    } 

public void renderGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glViewport(0, 0, Display.getWidth(), Display.getHeight());
    glLoadIdentity();

    glRotatef(xrot, 1.0f, 0.0f, 0.0f);
    glRotatef(yrot, 0.f, 1.0f, 0.0f);
    glTranslated(-xpos, -ypos - 19, -zpos - 5);

    glEnableClientState(GL_VERTEX_ARRAY);
    ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vertexBufferID);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    for (int y = 0; y < 16; y++) {
        for (int x = 0; x < 16; x++) {
            for (int z = 0; z < 16; z++) {
                glPushMatrix();
                glTranslatef(x, y, z);
                glDrawArrays(GL_QUADS, 0, 24);
                glPopMatrix();
            }
        }

    }
    glDisableClientState(GL_VERTEX_ARRAY);
}

VBOを使用glMapBufferおよびglUnMapBuffer変更する必要があることはわかっていますが、キューブを保存し、必要に応じて削除するにはどうすればよいですか? ArrayList を使用する必要がありますか? また、立方体をレンダリングする方法が間違っていると言われました。新しい座標だけで 1 つの立方体をレンダリングしていると誰もが言うからです。彼らは私の頂点データは同じままであると言っていますが、それはどういう意味ですか?

基本的に私の質問は、1. 配列を使用してキューブのリストを保持し、それらを VBO にロードしてから、キューブの一部を削除するにはどうすればよいですか? 2. 頂点データを変更して、1 つの立方体だけでなく、さまざまな立方体を何度もレンダリングするにはどうすればよいですか?

4

2 に答える 2

0
  1. antonijnが書いたように、VBOとして1つのキューブを持ち、そのモデルビューマトリックスを変換できます
    • 変換が遅くなることがあります (立方体が多すぎる場合)。
    • 変換は、行列変換よりも少し高速な一定のオフセットによって、シェーダー内でも実行できます。
  2. より速い方法は、すべてのキューブを VBO に入れることです
    • メモリを浪費しますが、立方体はそれほど大きくありません (6 面のみ)
  3. キューブを CPU アクセス可能なメモリに永続的に保存します。
    • シーンが変わったら、レンダリングのために VBO にコピーします。
    • CPU<->GPU 間で前後にデータを転送しない
    • CPU から GPU にデータをコピーするだけです。
  4. また、インデックスのない VBO を使用することをお勧めします (drawarrays ではなく drawelements)。
    • インデックス作成はあまりよくありません
    • 多くの場合、悪いドライバーでクラッシュすることさえあります

コードについては、https ://stackoverflow.com/a/18672821/2521214 を参照してください。 ただし、その投稿では GLSL の目的で VAO+VBO を使用しているため、GLSL を使用していない場合は、いくつかの変更が必要です。

于 2013-09-13T15:19:37.777 に答える
-1

ほとんどの場合、シーンの CPU 表現 (この場合は立方体のリスト) と GPU 表現 (頂点バッファーなど) があります。

あなたの場合、立方体はその位置によってのみ定義されます。それらはすべて同じサイズなどを持っています。複数の立方体をレンダリングする方法のいくつかのオプションを次に示します。

  1. 頂点シェーダーで均一な位置変数を定義し、これを頂点位置に追加します。シェーダーを使用しない場合は、モデル ビュー マトリックスで変換マトリックスとしてオフセットを指定します。異なるマトリックス/オフセットを使用して、同じ頂点バッファーを数回レンダリングします。

  2. GPU のジオメトリ シェーダーで立方体を作成します。したがって、頂点バッファーで立方体の位置を指定するだけです。頂点バッファーをマップすると、新しいデータをコピーできるデータへのポインターが取得されます。

  3. インスタンス化を使用します。シェーダに位置の配列を提供し、インスタンス モードで立方体をレンダリングします。インスタンス ID を使用して、オフセット ベクトルを決定します。

于 2013-02-03T22:00:23.340 に答える