複数のプリミティブのジオメトリシェーダー


8

複数のプリミティブを処理できるジオメトリシェーダーを作成するにはどうすればよいですか?たとえば、三角形のジオメトリシェーダーを作成するときは、次のようにレイアウトを定義します。

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;

しかし、このシェーダーを使用すると、線や点が表示されません。だから追加:

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;
layout(lines) in;
layout(line_strip, max_vertices=2) out;

シェーダーはコンパイルして実行しますが、ライン(または最後に定義されたプリミティブが何であれ)のみをレンダリングします。

それでは、複数のタイプのプリミティブを処理する単一のジオメトリシェーダーをどのように定義しますか?またはそれは不可能であり、各タイプを描画する前に複数のシェーダープログラムを作成してシェーダープログラムを変更する必要がありますか

回答:


7

OpenGLが複数のタイプのプリミティブを出力するジオメトリシェーダーをサポートしているとは思いません。2番目のコードブロックがコンパイルされたことに本当に驚いています...おそらく、構成を上書きしただけでしょうか?

複数のシェーダーを作成し、少なくとも三角形/線と点については、それらを切り替える必要があります。実際には、フラグメントシェーダーを使用して三角形を受け取ることができますが、重心座標に従って三角形の内側にあまりにも遠くにあるフラグメントを破棄することでラインのみをレンダリングすることができます。その正確な実装については、ジオメトリシェーダーとワイヤーフレームの描画に関するOpenGL Orange Bookとそのセクションを参照します(正確な章を追跡した後で戻って編集します)。

幸せなコーディング!


2

複数のプリミティブタイプを処理するジオメトリシェーダーを使用してプログラムを作成することはできません。

つまり、複数のプリミティブ型をサポートするために多くの作業を行う必要はありません。おかげARB_separate_shader_objectsは、あなたは、もはやありません一緒にあなたのシェーダーステージの全てをリンクします。1つの頂点のみのプログラム、1つのフラグメントのみのプログラム、および2つから3つのジオメトリのみのプログラムを組み合わせて組み合わせることができます。互換性のあるインターフェイスを使用している限り、問題はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.