頂点シェーダーでピクセルのレンダリングを終了できますか。たとえば、頂点が特定の要件を満たしていない場合、その頂点のレンダリングをキャンセルしますか?
6 に答える
理論的には、頂点シェーダーを使用して縮退 (ゼロ領域) プリミティブを生成できます。領域がゼロのプリミティブはラスタライズされないため、フラグメントはレンダリングされません。ただし、特に頂点を共有するプリミティブを使用している場合は特に直感的ではありません。
しかし、いいえ、頂点をキャンセルしてもほとんど意味がありません。これは、プリミティブが構築される基本単位です。単純に 1 つの頂点を削除すると、ラスタライズされた出力が未定義の方法で変更されます。
簡単に言えば、頂点は画面上にピクセルを作成するものではありません。最終的にピクセルにつながるのは、プリミティブを作成する頂点間の接続性です。ジオメトリ シェーダーはプリミティブごとに動作するため、通常、ラスター化とフラグメント シェーディングをプログラムでキャンセルする場所です。
アップデート:
GL_POINTS
あなたがプリミティブ型として使用していることに気づきました。この特殊なケースでは、頂点がパイプラインをさらに下るのを防ぐために必要なことは、カメラの表示ボリュームの外側のどこかにその位置を設定することだけです。頂点はクリップされ、ラスタライズやフラグメント シェーディングは発生しません。
ラスタライズをスキップし、フラグメント シェーダーをまったく実行する必要がないため、フラグメント シェーダーで何らかの条件をテストしてから破棄する場合、これははるかに効率的なソリューションです。言うまでもなく、discard
通常、GPU に結果を破棄するように指示するポストシェーダー実行フラグとして機能します。GPU は、シェーダーのどこでdiscard
命令を発行しても、シェーダー全体を強制的に実行することがよくあります。したがってdiscard
、パフォーマンスが向上することはめったになく、多くの場合、より有用な可能性のある他のハードウェア最適化を無効にする可能性があります。残念ながら、これは GPU がシェーダー ワークロードをスケジュールする方法の性質です。
最も安価なフラグメントは、処理する必要がないフラグメントです:)
頂点シェーダーでピクセルのレンダリングを終了することはできませんが (ピクセルを処理しません)、フラグメント シェーダーでは破棄命令を使用して終了できます。
頂点の削除など、頂点ストリームに変更を加えることができますが、それを行う場所はジオメトリ シェーダーになります。ジオメトリ シェーダーを調べてみると、探している解決策が単に頂点の「放出」に失敗することで見つかる場合があります。
編集: 三角形のストリップをレンダリングする場合、頂点が削除されたときに新しいプリミティブを開始するように注意する必要があるでしょう。geom を調べれば理由がわかります。シェーダー。GL_POINTS を使用すると、問題は少なくなります。
はい、たとえば、頂点が 2 つだけの三角形ストリップを送信した場合、実際には何もレンダリングできません。最初にこのような縮退したストリップを渡した場合と同様です。ただし、これは頂点ストリームを GL 側で変更できないという意味ではありません。
お役に立てば幸いです >トム