私はそれを別の方法で行います。何か問題があるかもしれません。いくつかの隠された危険なもの。
(私はC#+ OpenTK.GameWindowを使用しています)
オブジェクトをインスタンス化するために、すべてのインスタンスのモデルマトリックスのセットに対して、個別の配列バッファーオブジェクトを使用します。共有された頂点で:
#version 400
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 texcoord;
layout (location = 4) in mat4 model_matrix;
uniform mat4 proj_matrix, view_matrix;
私のC#コードでは、行列はfloat配列に格納されています float[] mat4_array
次に、配列を配列バッファオブジェクトにバインドします。
public void bind_data_instances()
{
GL.BindBuffer(BufferTarget.ArrayBuffer, id_InstanceBO);
GL.BufferData(BufferTarget.ArrayBuffer, mat4_array.Length * sizeof(float), mat4_array, BufferUsageHint.DynamicDraw);
}
フレームごとにモデルマトリックスが更新されます。更新するmat4_array
には、次のように呼び出します。
Buffer.BlockCopy(mat4_array_new, 0, mat4_array, 0, sizeof(float) * mat4_models.Length);
シーンをレンダリングします。を使用してGL.DrawElementsInstanced
。
追加のOpenGL呼び出しはなく、完全に機能します。