2011-02-25 3 views
3

ピクセルシェーダーでピクセルを破棄することはできますが、すべてのピクセルで呼び出される高速フェーダーシェーダーでさえも重要なことはないと思いますか?頂点シェーダが三角形全体を捨てることができる方法はありますか?私はかなり確信しています。はプリミティブにアクセスできませんが、同じ結果を得るためのトリックはありますか?頂点シェーダーを使用してレンダリングされないように三角形をドロップすることはできますか?

ここでSM 3.0を話す - 新しいバージョンでの完全な議論を歓迎します。

答えて

1

ジオメトリシェーダは、あなたが知っているように自明に行うことができますが、SM3ではそのようなことはありません。

すべての頂点シェーダが個々の頂点であるので、頂点シェーダが三角形をそのように識別するのは厳しいです。しかし...原則として可能です。

w座標をゼロに設定すると、点が無限に投影されます。すべての点のw座標を0に設定すると、三角形全体が無限になり、レンダリングされません。

また、gl_ClipDistanceをゼロまたは0未満の値に設定することもできます(これらは実際には使用されませんが、これはうまくいくはずです)。これは頂点をクリッピング平面の「後ろ」としてマークします。 3つの頂点のすべてがクリッピング平面の後ろにある場合、三角形は表示されません。

しかし、破棄する三角形に属する頂点を特定する方法が必要です。非常に特殊な状況がなければ簡単にはできません(たとえば、与えられたバウンディングボックス内のすべての三角形、または頂点属性#5がゼロであるすべての三角形などを破棄する。

+0

興味深いアイデア。私の場合は、基本的にカスタムスライス面(シェイダーのparamsで渡された)に基づいたトリ・カリングです。ピクセルごとのテストを行いますが、ポリ全体を落とすことができればそれは素晴らしいことです。問題は、頂点から、もう一方が「間違った」側にあるかどうかを知る方法を推測することです。本当に頂点にいくつかのプロパティを設定したいのですが、_all 3_頂点が設定されていないと効果がありません。 –

+0

しかし、それは単にユーザーのクリッププレーンではないのですか? 1つのカスタムスライスプレーンは、すべてのハードウェアでほとんどサポートされているはずです(5〜6年前のカードでも4つの余分なプレーンをサポートしていたと思います)。あるいは、それはおそらく "斜めに面した"ハックでさえできます。 – Damon

+0

@ dm.sktはい、それはピクセルレベルにあります(スライスされた三角形は部分描画されます)。ハードウェアクリッププレーンを追加して、全体のポリを取り除き、ピクセルシェーダーが処理するために少なくとも部分的に見えるものだけを残すことをお勧めしますか? –

関連する問題