glScissorの目的は何ですか?


32

私はそれがステンシルテストよりも効率的であることを知っていますが、ビューポートで投影変換を使用して同じ機能を達成できると仮定していますか?

回答:


46

それらは、互いの選択肢よりも補完的です。ほとんどの場合、はさみ長方形をビューポートと同じ値に設定します。

glViewport()は、正規化された投影空間からスクリーン空間への変換を指定します。ポリゴンは投影空間の端にクリップされますが、glClear()などの他の描画操作はクリップされません。したがって、glViewport()を使用して画面スペースビューポート領域の位置とサイズを決定しますが、ラスタライザはその領域外のピクセルを時々レンダリングすることができます。

それがシザーインの出番です。glScissor()は、も描画されない画面スペースの長方形を定義します(シザーテストが有効な場合)。

そのため、たとえば、ビューポートが大きなウィンドウの小さな部分に設定されていても、次のコードは画面全体をクリアします。

glViewport(200,200,100,100);
glClear(GL_COLOR_BUFFER_BIT);

glScissor()を追加し、シザーテスト(デフォルトでは無効)を有効にすると、クリアが制限されます。

glViewport(200,200,100,100);
glScissor(200,200,100,100);
glEnable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT);

時々、自動的にビューポート領域をはさみますが、GL仕様に違反する実装に遭遇します。

さらに、はさみ長方形を使用して、特殊効果、UI要素などのために、描画を一時的にビューポートのサブ長方形に制限することができます。


11
より明確にViewportするために、頂点の計算をクリップします。線の太さ> 1の線または> 1の点をgl_PointSize描画する場合、ビューポートの外側にも描画します。
gman 14年

13

グラフィックスパイプラインの2つの完全に異なる部分で動作します。

glViewportは実際に変換を指定し、頂点シェーダーの後、フラグメントシェーダーの前に発生する変換です。概念的に適合する場所を確認するのに役立つ場合は、頂点データをワールド空間からスクリーン空間に取得するために使用される変換の一部であると考えてください(つまり、モデルビューと投影に比較的密接に関連しています)。

シザーテストは、フラグメントシェーダーの後に発生します。ブレンド、深度/ステンシルなど、その時点で発生する他のすべてのフラグメントごとの操作と一緒に実行されます。したがって、フラグメントがシザーテストでテストされると、すでに終了していますビューポート変換。

はい、はさみテストはフラグメントの画面スペース座標に基づいた単純な受け入れ/拒否であるためステンシルより高速になりますが、ステンシルはステンシルバッファの現在の値と比較する必要があり、現在の値を増減することも考慮します深度テストの結果など。

したがって、これらすべてをまとめると、なぜシザーテストが存在するのかがわかります。現在のビューポート変換を実際に変更せずに、フラグメントごとの操作を画面の長方形部分に制限することができます。


6

私は視覚的に説明されるこの種のものが好きです。

OnpenGLには、X軸とY軸の両方で-1から+1になる2D座標があります。

ここに画像の説明を入力してください

次に、この画像をウィンドウ座標にマッピングする必要があります。

背景が暗い色で、透明な色が白のウィンドウがあると想像してください。

最も一般的なケースは、ビューポートとハサミで画面全体をカバーすることです。

ここに画像の説明を入力してください

ただし、画面のより小さな領域に設定できます。

ここに画像の説明を入力してください

これらの地域は異なる場合があります。次の例では、ビューポートは画面全体をカバーしていますが、シザーは小さなボックスです。

ここに画像の説明を入力してください

この最後のケースでは、ハサミが画面全体を覆い、ビューポートが小さなボックスです。glClearはさみ領域によって決定されるため、画面全体に影響することに注意してください。

ここに画像の説明を入力してください


1
これは私にとって最も明確な説明であり、本当に図面が必要でした。
ローラン・カイレット

5

glScissorsは、画面の一部に対するジオメトリのクリッピングを実現します。

たとえば、テキストをスムーズにスクロールするGUIボックスをレンダリングする場合、これが必要になります。GUIで覆われた画面の部分の外側のすべてのジオメトリをクリップしますが、まだ内部にある部分的なテキストまたはポリゴンを保持します。

glViewportは投影座標をデバイス座標にマップしますが、クリップしません。

glStencilは、不規則な形状など、より複雑なパターンで個々のピクセルをマスクするために使用されます。したがって、glScissorsは高速です。


1

glScissorは、ビューポートを使用した投影変換よりも簡単です。

glScissorテストはレンダリング時に変更するピクセルを指定し、glViewportはglがデバイス座標からウィンドウ座標にマップする方法を変更します。

次に、レンダリングする長方形にビューポートを設定し、ビューポートによって行われたスケーリングを取り消すために投影マトリックスを調整することとの違いは何ですか。

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