回答:
それらは、互いの選択肢よりも補完的です。ほとんどの場合、はさみ長方形をビューポートと同じ値に設定します。
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要素などのために、描画を一時的にビューポートのサブ長方形に制限することができます。
グラフィックスパイプラインの2つの完全に異なる部分で動作します。
glViewportは実際に変換を指定し、頂点シェーダーの後、フラグメントシェーダーの前に発生する変換です。概念的に適合する場所を確認するのに役立つ場合は、頂点データをワールド空間からスクリーン空間に取得するために使用される変換の一部であると考えてください(つまり、モデルビューと投影に比較的密接に関連しています)。
シザーテストは、フラグメントシェーダーの後に発生します。ブレンド、深度/ステンシルなど、その時点で発生する他のすべてのフラグメントごとの操作と一緒に実行されます。したがって、フラグメントがシザーテストでテストされると、すでに終了していますビューポート変換。
はい、はさみテストはフラグメントの画面スペース座標に基づいた単純な受け入れ/拒否であるためステンシルより高速になりますが、ステンシルはステンシルバッファの現在の値と比較する必要があり、現在の値を増減することも考慮します深度テストの結果など。
したがって、これらすべてをまとめると、なぜシザーテストが存在するのかがわかります。現在のビューポート変換を実際に変更せずに、フラグメントごとの操作を画面の長方形部分に制限することができます。
私は視覚的に説明されるこの種のものが好きです。
OnpenGLには、X軸とY軸の両方で-1から+1になる2D座標があります。
次に、この画像をウィンドウ座標にマッピングする必要があります。
背景が暗い色で、透明な色が白のウィンドウがあると想像してください。
最も一般的なケースは、ビューポートとハサミで画面全体をカバーすることです。
ただし、画面のより小さな領域に設定できます。
これらの地域は異なる場合があります。次の例では、ビューポートは画面全体をカバーしていますが、シザーは小さなボックスです。
この最後のケースでは、ハサミが画面全体を覆い、ビューポートが小さなボックスです。glClear
はさみ領域によって決定されるため、画面全体に影響することに注意してください。
glScissorは、ビューポートを使用した投影変換よりも簡単です。
glScissorテストはレンダリング時に変更するピクセルを指定し、glViewportはglがデバイス座標からウィンドウ座標にマップする方法を変更します。
次に、レンダリングする長方形にビューポートを設定し、ビューポートによって行われたスケーリングを取り消すために投影マトリックスを調整することとの違いは何ですか。
Viewport
するために、頂点の計算をクリップします。線の太さ> 1の線または> 1の点をgl_PointSize
描画する場合、ビューポートの外側にも描画します。