2

私はこれを行う方法を見つけるために長い間試みてきました: OpenGL で定義された領域の外側をクリッピングします。

ビューポートやはさみを使用してクリップしたくありません。私は狂ったように検索してきましたが、見つけたのはビューポート/はさみの使い方だけです。

「このピクセルの x が 10 単位未満の場合は描画しない」のようなものを定義したいと思います。「x が 10 ~ 20、y が 10 ~ 20、z が 10 ~ 20 の場合は描画しても問題ありません。それ以外の場合は、ピクセルをレンダリングしないでください」のようなものです。

脚注: stackoverflow で質問するには登録が必要だというのは残念です。サイトが開いていて、アカウントの作成がオプションだった前の方が良かった.

4

2 に答える 2

2

このサイトで質問をしたばかりの典型的な、もう少し検索した後にそれを理解しました。

Java コード (LWJGL を使用しています):

DoubleBuffer eqn1 = BufferUtils.createDoubleBuffer(8).put(new double[] {-1, 0, 0, 100});
eqn1.flip();
GL11.glClipPlane(GL11.GL_CLIP_PLANE0, eqn1);
GL11.glEnable(GL11.GL_CLIP_PLANE0);

いつものように、OpenGL は文書化されていません (不十分で、把握しにくい) ため、いくつかのフォーラムでこれを説明するものを最終的に見つけるまで検索する必要がありました (そして、バッファーを反転する必要があることが明らかになりました): 最初の 3 つの double はクリッピング プレーンの法線。最後の (100) は、プレーンがワールドの原点 (0,0,0) からどれだけ離れているかです。

したがって、カメラが (0,0,0) をまっすぐ見ている場合、上記のサンプル コードは右側に平面を作成し、OpenGL がその右側に物をレンダリングしないようにします。平面は x=100 にあり、左 (-1) を向いています。

今後、その答えを探している人の検索結果になれば幸いです。

于 2013-06-02T19:47:26.967 に答える
0

Fixed-Function には、そのためのユーザー定義のクリッピング プレーンがあります。詳細については、 を参照glClipPlane()してください。あなたが話した効果を達成するために、これらの平面を 6 つ定義することができます。

最新のシェーダーベースの GL は、そのgl_ClipDistance[] ようなものを実装するための出力変数配列を提供します。

あなたが説明するテストはフラグメントごとのようです。そのため、フラグメント シェーダーで、領域外のすべてのフラグメントを破棄することでこれを行うこともできます。ただし、これは非常に非効率的です (また、初期の Z テストを使用できなくなります) ので、注意が必要です。これはおそらくステンシル テストと組み合わせて、x と y を制限し、シェーダーで z に対してのみテストを行うことができます。

于 2013-06-02T19:35:53.303 に答える