1

(VERSION combined with programmable pipeline and fixed pipeline)glslを使用するプログラム可能なパイプライン(固定パイプラインなし)のみを使用してボリュームをレンダリングしたい。これを実現するには、レンダラーをマルチパスする必要があります。これは、さまざまなシェーダーを使用してさまざまなシーンを順番にレンダリングすることを意味します。私のthree methods頭に浮かぶのは:

  1. 1つのシェーダープログラムを使用し、シェーダーをデタッチ->シェーダーをアタッチ->新しいシーンをレンダリングするたびにプログラムを再コンパイルします。
  2. パスごとに1つのシェーダープログラムを使用すると、複数のシェーダープログラムが終了します。
  3. glslのサブルーチンを使用して、異なるパスをレンダリングするときに異なるサブルーチンを選択します。

いつ最初の方法を使うべきなのかしら?2edメソッド?など、経験豊富な開発者がお手伝いできますか?

4

1 に答える 1

1

多くの問題は、複数のパスなしで解決できます。それらなしでテクニックを作ってみてください。他に何も機能しない場合は、方法3を使用します。

これについての私の考え:

  • 方法1は非常に遅く、使用できません。
  • 方法2は大変な作業ですが、うまく行けば「高速」です。
  • 方法3は簡単でエレガントですが、追加の処理オーバーヘッドがあります。オブジェクトを数回レンダリングして、現在のパス番号をシェーダーに渡すことができます。

方法3の例:

uniform int currentPass;

/* OTHER UNIFORMS */

void main()
{
    if(currentPass == 1)
    {
         /* DO SOMETHING */
    }
    else if(currentPass == 2)
    {
         /* DO SOMETHING */
    }
    else if(...) { ... }
}

私の考えでは、最善のアプローチはごく少数のシェーダー(おそらく、1つのマテリアルシェーダー、1つの後処理シェーダーなど)のみを使用することです。したがって、方法3はほぼ完璧です。

ユーバーシェーダーについて考えたことはありますか?それらはあなたの方法に「似ている」ものです3.グーグルそれ:)私はこの質問もお勧めします。

また、ifステートメントはパフォーマンスを大幅に低下させる可能性があることに注意してください。

于 2012-05-15T13:23:04.640 に答える