GLSLを使用してインターレースモードで効率的にレンダリングしたいと考えています。GLSLインターレース
私はalrdyこのような操作を行うことができます。
vec4 background = texture2D(plane[5], gl_TexCoord[1].st);
if(is_even_row(gl_TexCoord[1].t))
{
vec4 foreground = get_my_color();
gl_FragColor = vec4(fore.rgb * foreground .a + background .rgb * (1.0-foreground .a), background .a + fore.a);
}
else
gl_FragColor = background;
しかし、私の知る限りGLSLに分岐の性質を理解しているとして、両方の分岐が実際に「even_row」以来、実行されるランと考えられているということです時間値。
かなり重い関数 "get_color"を不必要に呼び出さないようにするためにここで使用できるトリックはありますか? is_even_rowの動作は静的です。
これを行うには別の方法がありますか?
注:GLSLコードにカスタムブレンド関数があるので、glPolygonStippleは機能しません。
ソフトウェアレンダラーで実行している場合を除き、私は_strongly_インターレースモードでのレンダリングをお勧めしません。それはもっと悪く見えますが、それ以上のスピードはありません。実際、それは非常に遅くなるかもしれません。インターレースレンダリングは、GPUの自然な2x2ブロックシェーディングを妨害します。 – Damon
私は1080iで動いているテレビに表示されている映像を合成して繋ぎ合わせています。インタレースする必要があります。 – ronag
その場合、Y解像度の1/2ですべてを行い、最後にテクスチャ付きフルスクリーンクワッドを描画し、ステンシルバッファを悪用して奇数ラインをマスクするのはどうですか?このように、少なくとも最後のパスを除き、少なくともGPUに優しいものです。あるいは、ステンシルが利用できない場合、 "明示的なZカリング"を行うこともできます。 – Damon