事前概念
わかりました、それで私がこれまでに集めたのはこれです:
- 固定パイプラインを使用しない(非推奨または非推奨)
- vbosは「オブジェクトモデル」を格納します(n頂点データ、ほとんど)
- vaosは、データがどのように配置されるかを記述し、描画呼び出しが各vboのどの部分がどの種類の頂点情報に対応するかを認識します(1つのvaoは複数のvboを参照でき、その逆は少し難しい)
- 各描画呼び出しは、シェーダーに頂点データも送信します
3Dの見方(オプション)
これらの情報があれば、3Dの複雑なオブジェクトの描画が最新のOpenGLで非常に優れていることがわかります。基本的に、(おそらくBlenderまたは他の同様のソフトウェアからの)オブジェクトモデルの束をローカル座標を持つVBOにロードし、次に、オブジェクトの各インスタンスに異なるシェーダーパラメーター(オフセット)を指定して、ワールドスペースに描画します。
問題/質問
ただし、2Dでは問題と優先順位はまったく異なります。それほど複雑なオブジェクトを描画する必要はありません。複雑な投影行列は必要ありません。シェーダーははるかに単純です。
最新のOpenGLで頻繁に(実際には頻繁に、基本的にすべてのフレームで)変化するジオメトリを描画するための最良の方法は何でしょうか?
次の段落では、問題のいくつかの考え(円と四角形の問題)を見ることができます。これにより、興味のある変更の種類をより明確に識別できます。
私の試み(オプション)
そこで、基本的な2Dジオメトリを画面に描画する方法を考え始めました。
- 正方形:
[(1, 0), (1, 1), (0, 1), (0, 0)]
ローカル空間で正方形のジオメトリのVBOを読み込み、シェーダーに正方形の実際の幅と世界座標および色情報を提供します
涼しく、簡単に見えます。円に移動しましょう:
- 円:三角ファン...ええ。どのくらいの精度(頂点の数)?小さな円の精度は小さく、バグの円の精度は高くなければなりません。明らかに1 VBOをロードしても、すべてのケースに対応できるわけではありません。円のサイズが大きくなるために精度を上げる必要がある場合はどうなりますか?
かっこいい。少し簡単な長方形に移動しましょう。
- 長方形:ええ。「一般的な長方形のジオメトリ」はありません。幅と高さの比率があればそれだけですが、サイズが変化すると、各長方形はおそらく異なります。
ご覧のとおり、物事はそこから下り坂になります。特に複雑なポリゴンなどではそうです。
コードポリシーなし:P
アイデアの概要が必要なだけで、コードは必要ありません。特にCまたはC ++コードは必要ありません。「この頂点データでVBOを作成し、それをバインドする...」のように言ってください。