4

だから私はたくさんのクワッド (または立方体) を描きたいと思っていて、ジオメトリ シェーダーと呼ばれるこの素敵なものに出くわしました。

私は今それがどのように機能するかをちょっと理解しており、おそらくそれを操作して頂点バッファー内のすべての頂点の立方体を描画することができますが、それが正しい方法であるかどうかはわかりません. ジオメトリ シェーダーは頂点シェーダーとフラグメント シェーダーの間で発生するため、スクリーン スペース内の頂点で機能します。しかし、変換を行うにはワールド空間でそれらが必要です。

では、頂点シェーダーで単純に入力をジオメトリ シェーダーにパイプし、プリミティブを作成した後にジオメトリ シェーダーに modelviewproj マトリックスを乗算しても問題ないでしょうか? 統合されたシェーダー アーキテクチャでは問題ないはずですが、頂点シェーダーを冗長化するときはまだ吐き気がします。

代替手段はありますか?それとも、これは本当に「正しい」方法ですか?

4

1 に答える 1

3

全然OKです。

それとは別に、インスタンス化されたレンダリング ( glDrawArraysInstancedglDrawElementsInstanced) と頂点属性の除数 ( glVertexAttribDivisor) を使用することを検討してください。このようにして、ジオメトリ シェーダーをまったく使用せずに同じタスクを実行できます。

たとえば、通常のキューブ ジオメトリをバインドできます。次に、各インスタンスに必要な立方体の位置を保持する特別な頂点属性があります。divisor=1 でバインドする必要があります。これにより、描画されるインスタンスごとに前進します。glDraw*Instanced次に、インスタンスの数を指定して、 を使用して立方体を描画します。

座標に対してgl_VertexIDまたはを使用して、テクスチャから入力データをサンプリングすることもできます。gl_InstanceID

于 2011-02-14T19:37:54.613 に答える