2016-04-16 15 views
0

通常、メッシュ固有の情報(VBO/VAO)をインスタンス固有の情報(変換、ユニフォームなど)から分離しようとします。ハードウェアインスタンス化のためのVBOの再利用

このように、インスタンス情報を操作するコードの部分は、VBO/VAOについて何も知る必要はなく、その逆もあります。

しかし、最近、glDrawInstancedを使用してハードウェアインスタンスを使用し始めました。インスタンス属性がVAOで結合されているため、懸念の分離がより困難になっています。

通常、VBO/VAOは私の.OBJローダー(これを構築するのに必要なすべての情報を持っています)から構築され、コードの他の部分だけがシェーダーユニフォームを心配しています。さて、これらのコード部分は、インスタンス属性に関する情報を添付するためにVAOの構造を知る必要があります。

通常のレンダリングとインスタンス化されたレンダリングの両方で再利用できるVBOを使用すると、これはさらに厄介なものになります。

メッシュ属性とインスタンス属性を設定する際に懸念事項を分離するための推奨方法はありますか?

私は2つのVAOを持っていると思っていました.1つは通常のレンダリング用で、もう1つはインスタンス化されたレンダリング用で、必要な余分なインスタンス属性を追加しましたが、元のVAOデータを複製、インスタンスのパラメータだけでなく、VBO/VAOの実際の構造を知る必要があります。

+0

ジオメトリに対して別のレベルの抽象化を作成すると、特定の方法で(インスタンス化の有無にかかわらず)データのバッチを作成および描画します。 – Drop

+0

さて、これは私が避けたいと思っていたものです...他に提案がなければ、最終的にやります。 – glopes

答えて

0

これを行う方法が見つかりました!

glGetVertexAttrib*を使用してVAOの状態を実際に検査できることを忘れていました。これにより、インスタンスパラメータ操作モジュールは、元のメッシュVAOからその基本構造をインスタンス化して再構築するための新しいVAOを実際に作成し、インスタンス化パラメータの追加属性を追加することができます。

この方法では、メッシュの特定の頂点構造から独立したままにすることができ、インスタンスデータの構造についてのみ心配する必要があります。

検査はこのような何かを行く:

std::vector<VertexAttrib> attribs; 
for (int i = 0; ; i++) 
{ 
    int enabled; 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled); 
    if (enabled == 0) break; 

    VertexAttrib attrib; 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &attrib.size); 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &attrib.stride); 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &attrib.type); 
    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &attrib.normalized); 
    attribs.push_back(attrib); 
} 

VertexAttribがイントロスペクト頂点が状態を属性格納するために私自身の構造です。

イントロショト状態のリストを取得したら、新しいVAOを作成してバインドし、その状態を元のVAOと同じに設定するだけです。次に、ハードウェアのインスタンス化のために余分な属性を追加します。これには、この新しいVAOを元のVBOにバインドし、まったく同じメッシュデータを再利用できるという利点もあります。

すべては、通常のインスタンス化パイプラインに従って処理されます。インスタンス化せずにモデルを描画する必要がある場合は、元のVAOだけをバインドすることもできます。

関連する問題