0

アプリケーションでさまざまな「ネストされた」コンテキストを使用しています (シェーダーとジオメトリの共有用)。VAO はコンテキスト間で共有できないため、使用できません。

私のメッシュ データは、1 つの VBO に一意の頂点の「プール」として保存され、別の VBO には面を構成するインデックスが保存されます。現在、CAD アプリでワイヤフレーム レンダリングにこれを使用していますが、フラット シェーディング モードを追加したいと考えています。そのためには、面法線が必要です。

頂点法線が必要な場合は、データを頂点位置データに追加するだけですが、ここではそれを行うことはできません。これは、レンダリングされる面に応じて頂点の面法線が異なるためです。理想的には、顔の法線とインデックスを保持する別の VBO ペアを作成したいと考えていますが、VAO なしでは 2 つの VBO を同じターゲットにバインドできません - それらが異なる属性で使用されている場合でも。

通常のルートは、複数の VBO を同じターゲットに割り当てることができる VAO を使用することですが、ジオメトリ コンテキストが共有されており、VAO が共有されていないため、それらを使用できません。この問題の代替ソリューションはありますか?

4

1 に答える 1

4

頂点法線が必要な場合は、データを頂点位置データに追加するだけですが、レンダリングする面に応じて頂点の面法線が異なるため、ここではできません。理想的には、顔の法線とインデックスを保持する別の VBO ペアを作成したいと考えていますが、VAO なしでは 2 つの VBO を同じターゲットにバインドできません - それらが異なる属性で使用されている場合でも。

あなたの問題は、VAOやバッファオブジェクトとは何の関係もありません。VAO では、複数のインデックス リストを使用できません。「面の法線」を持つことはできません。

頂点配列オブジェクトは、頂点属性バインディングを格納するコンテナーにすぎません。それらなしではできなかったことができるようになるわけではありません。すべての属性バインディングを変更する簡単な方法があります。

頂点の位置をさまざまな面に分割する必要があります。そのため、位置の値を複製して、それぞれの固有の位置/法線のペアが適切に固有になるようにする必要があります。VAO はこの制限を回避できません。

参考までに: VAO が共有されない理由は、それらが単純すぎて共有できないからです。同じ VAO を 2 つの異なるコンテキストで簡単に設定できます。使用したいコンテキストで VAO を作成し、通常どおりにセットアップしてください。これは単なる状態オブジェクトです。実際には何も含まれていません。

于 2011-12-10T20:09:01.933 に答える