0

VBO の内容を変更しようとしていますが、それはストリーム ドロー用であるため、ここ(およびここ) で説明されている概念を理解し、従おうとしていますが、それを試みるとエラーが発生します。

これは私がやろうとしていることです:

void Model::Draw()
{
    //Changing only the vertexesVBO
    _vertexes[0] += 0.0001f;
    glBindBuffer(GL_ARRAY_BUFFER, _vboVertexes._bufferID);

    //This works
    //glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float), &_vertexes[0]);

    //But this doesn't
    glBufferData(GL_ARRAY_BUFFER, 0, NULL, GL_STREAM_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, _vertexCount * sizeof(float), _vertexes);

    //Call vertexVBO, uvVBO, indexIBO, disable them
}

おそらく、サイズ _vertexCount * sizeof(float) の新しい BufferData と初期化されていないデータを作成し、同じ_vertexesデータをそれにアップロードして、次の描画呼び出しで使用します。しかし、これはアクセス違反読み取りのエラーをスローしています。

これを機能させるにはどうすればよいですか?そして、私が正しく理解していれば、これでアニメーション用のダブルバッファ VBO を実装する必要はありませんよね?

4

1 に答える 1

1

おそらく、サイズ _vertexCount * sizeof(float) の新しい BufferData と初期化されていないデータを作成し、同じ _vertexes データをそれにアップロードして、次の描画呼び出しで使用します。

いいえ。サイズ0の新しいバッファ ストレージを作成するだけです。glBufferSubData()範囲外のバッファにアクセスしているため、更新は失敗します。

于 2013-09-20T21:17:55.427 に答える