1

我想(VERSION combined with programmable pipeline and fixed pipeline)仅使用使用 glsl 的可编程管道(无固定管道)来渲染体积。为了实现这一点,我需要多通道渲染器,这意味着按顺序使用不同的着色器渲染不同的场景。我three methods想到了:

  1. 使用一个着色器程序并在渲染新场景时分离着色器 -> 附加着色器 -> 重新编译程序。
  2. 每次使用一个着色器程序,然后退出多个着色器程序。
  3. 在渲染不同的 pass 时使用 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(...) { ... }
}

在我看来,最好的方法是只使用很少的着色器(可能是一个材质着色器、一个后处理着色器等),所以你的方法 3 几乎是完美的。

有没有想过超级着色器?它们与您的方法“类似” 3. Google it :) 我也推荐这个问题

还要小心,if 语句可能会大大削弱您的性能。

于 2012-05-15T13:23:04.640 回答