問題は、バッファに書き込むことです。
void* dst = glMapBufferRange(target, offset, size, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
これは最初の呼び出しでは正常に機能しますが、2 番目の呼び出しでは機能しません。正確な理由はわかりません。
考えられる原因のうち:
- ゼロがターゲットにバインドされている場合、GL_INVALID_OPERATION は glMapBufferRange によって生成されます。
- GL_INVALID_VALUE は、オフセットまたは長さが負の場合、オフセット + 長さがバッファ オブジェクトの GL_BUFFER_SIZE の値より大きい場合、または上で定義されたもの以外のビット セットがアクセスにある場合に生成されます。
- 長さはゼロです。
- バッファ オブジェクトは既にマップされた状態にあります。
- GL_MAP_READ_BIT も GL_MAP_WRITE_BIT も設定されていません。
- GL_MAP_READ_BIT が設定され、GL_MAP_INVALIDATE_RANGE_BIT、GL_MAP_INVALIDATE_BUFFER_BIT、または GL_MAP_UNSYNCHRONIZED_BIT のいずれかが設定されています。
- GL_MAP_FLUSH_EXPLICIT_BIT が設定され、GL_MAP_WRITE_BIT が設定されていません。
- GL_MAP_READ_BIT、GL_MAP_WRITE_BIT、GL_MAP_PERSISTENT_BIT、または GL_MAP_COHERENT_BIT のいずれかが設定されていますが、同じビットがバッファーのストレージ フラグに含まれていません。
...確認/修正する方法がわからない唯一のものは、「バッファーオブジェクトは既にマップされた状態にあります」です。それは私が見ているエラーに関連している可能性がありますか?
その場合、GL_MAP_PERSISTENT_BIT について読みましたが、4.2 をターゲットにしており、glBufferStorage には 4.4 が必要なので、その場合の状況を他にどのように修正できるかわかりません。
残念ながら、大量のものを変更せずに関連するすべてのコードを投稿することはできませんが、基本的なセットアップは、新しく作成された GL_ARRAY_BUFFER ごとに VAO を作成することであり、バッファーがバインドされるたびに (VAO のないコード)、私は代わりに VAO をバインドします。
バインドされている VAO は、"ローリング VBO" と呼ばれるバッファー用です。これは、すべてのテキストやその他の雑多なものをすべてキャッチするために使用されるためです。レンダリング。おそらく、それは多くの異なるものに使用されているためです...しかし、それが何であるかを正確に特定する方法はわかりません.
コードの一部やその他の情報が役立つ場合はお知らせください。この問題に正確に何が必要かはわかりません。助けてくれてありがとう!