(要求に応じて、回答するコメント)
インターレースの問題は、GPUが2x2クラスターでシェーダーを実行することです。つまり、インターレースから何も得られません(偏導関数を要求しない限り、優れたソフトウェア実装では、必要な実際のピクセルのみが実行される可能性があります)。
せいぜい、インターレースは同じ速度で実行されますが、最悪の場合、インターレースの余分な作業のために実行速度が遅くなります。数年前、ShaderX4にインターレースレンダリングを提案する記事がありました。私はその方法を半ダースのグラフィックカード(「2つの大きな」メーカーのそれぞれの3世代のハードウェア)で試しましたが、いずれの場合も動作が遅くなりました(場合によってはわずかに、場合によっては最大50%)。
できることは、すべての高価なレンダリングを垂直解像度の1/2で実行することです。これにより、ピクセルシェーダーの作業(およびテクスチャ帯域幅)が1/2に削減されます。次に、テクスチャ(GL_NEAREST)をアップスケールし、1行おきに破棄できます。
ステンシルテストは、ピクセルシェーダーが実行される前にピクセルを破棄するために使用できます。もちろん、ハードウェアは2x2グループでシェーダーを実行しているため、このパスでは何も得られません。ただし、それが最後のパスであるかどうかは関係ありません。これは、フェッチされた単一のテクセルを書き出す簡単なシェーダーです。よりコストのかかるコンポジションシェーダー(重要なもの!)は、半分の解像度で実行されます。
ここにコードを含む詳細な説明があります:偽の動的分岐。このデモでは、ステンシルを使用してライトの範囲外にあるピクセルを破棄することにより、ピクセルの照明を回避します。
ステンシルバッファを必要としない別の方法は、「明示的なZカリング」を使用することです。実際、これはさらに簡単で高速な場合があります。
このためには、Zをクリアし、カラー書き込みを無効にし(glColorMask
)、頂点が「近い」Z座標を持つフルスクリーンのクワッドを描画し、シェーダーにすべての奇数行のフラグメントを強制終了させます(または、必要に応じて非推奨のアルファテストを使用します。 )。gl_FragCoord.y
は、どの行を強制終了するかを知る非常に簡単な方法です。折り返す小さなテクスチャを使用することもできます(GLSL 1.0を使用する必要がある場合)。
次に、頂点に「遠い」Z値を含む別のフルスクリーンクワッドを描画します(もちろん、深度テストを使用します)。ハーフレゾテクスチャをフェッチして(GL_NEARESTフィルタリング)、書き出すだけです。デプスバッファの値は1行おきに「近い」ため、
glPolygonStipple
これと比べてどうですか?ポリゴンスティプルは非推奨の機能です。ハードウェアで直接サポートされておらず、シェーダーを「密かに」書き直して追加のロジックを含めるか、ソフトウェアにフォールバックすることで、ドライバーがエミュレートする必要があるためです。