Opengl 渲染时处理多个过程

Opengl 渲染时处理多个过程,opengl,glsl,Opengl,Glsl,我希望仅使用使用glsl的可编程管道(无固定管道)渲染卷。为了实现这一点,我需要多通道渲染器,这意味着以顺序使用不同的着色器渲染不同的场景。 我想到了三种方法: 每当渲染新场景时,使用一个着色器程序和“分离着色器->附加着色器->重新编译程序” 每次使用一个着色器程序,则存在多个着色器程序 使用glsl中的子例程在渲染不同过程时选择不同的子例程 我想知道什么时候我应该使用第一种方法?2ed方法?等等。有经验的开发人员能帮上忙吗?许多问题都可以不经过多次解决。试着做一个没有它们的技术。 如果其他方

我希望仅使用使用glsl的可编程管道(无固定管道)渲染卷。为了实现这一点,我需要多通道渲染器,这意味着以顺序使用不同的着色器渲染不同的场景。 我想到了三种方法:

  • 每当渲染新场景时,使用一个着色器程序和“分离着色器->附加着色器->重新编译程序”
  • 每次使用一个着色器程序,则存在多个着色器程序
  • 使用glsl中的子例程在渲染不同过程时选择不同的子例程

  • 我想知道什么时候我应该使用第一种方法?2ed方法?等等。有经验的开发人员能帮上忙吗?

    许多问题都可以不经过多次解决。试着做一个没有它们的技术。 如果其他方法都无效,请使用方法3

    我的想法是:

    • 方法1非常缓慢,无法使用
    • 方法2需要做很多工作,但如果 做得好,它是“快”
    • 方法3简单而优雅,但有一个 额外的处理开销。可以多次渲染对象,并将当前的过程编号传递给着色器
    方法3的示例:

    uniformintcurrentpass;
    /*其他制服*/
    void main()
    {
    如果(currentPass==1)
    {
    /*做点什么*/
    }
    else if(currentPass==2)
    {
    /*做点什么*/
    }
    如果(…){…}
    }
    
    在我看来,最好的方法是只使用很少的着色器(可能是一个材质着色器、一个后期处理着色器等),因此方法3几乎是完美的

    有没有想过uber着色器?他们有点像你的方法3。谷歌it:) 我也建议这样做


    许多问题不需要多次解决即可解决。试着做一个没有它们的技术。 如果其他方法都无效,请使用方法3

    我的想法是:

    • 方法1非常缓慢,无法使用
    • 方法2需要做很多工作,但如果 做得好,它是“快”
    • 方法3简单而优雅,但有一个 额外的处理开销。可以多次渲染对象,并将当前的过程编号传递给着色器
    方法3的示例:

    uniformintcurrentpass;
    /*其他制服*/
    void main()
    {
    如果(currentPass==1)
    {
    /*做点什么*/
    }
    else if(currentPass==2)
    {
    /*做点什么*/
    }
    如果(…){…}
    }
    
    在我看来,最好的方法是只使用很少的着色器(可能是一个材质着色器、一个后期处理着色器等),因此方法3几乎是完美的

    有没有想过uber着色器?他们有点像你的方法3。谷歌it:) 我也建议这样做


    我搜索了uber着色器。但uber着色器似乎在着色器文件中使用类似于
    #ifdef
    #endif
    宏的内容。如何使用
    #ifdef
    #endif
    在运行时的着色器文件中选择着色器文件的不同片段?我可以在我的OpenGL程序中的
    render()
    函数中设置define宏吗?不,没有预处理器来执行类似的操作。必须先使用类似于预处理代码的工具/库。在那之后,你可以编译/执行着色器。但也许这会对你有所帮助:我在互联网上搜索,并通过使用glsl 4.0中的新功能
    子例程
    找到了一个好的解决方案。这是一个非常棒的特性!谢谢分享……:)我搜索了优步着色器。但uber着色器似乎在着色器文件中使用类似于
    #ifdef
    #endif
    宏的内容。如何使用
    #ifdef
    #endif
    在运行时的着色器文件中选择着色器文件的不同片段?我可以在我的OpenGL程序中的
    render()
    函数中设置define宏吗?不,没有预处理器来执行类似的操作。必须先使用类似于预处理代码的工具/库。在那之后,你可以编译/执行着色器。但也许这会对你有所帮助:我在互联网上搜索,并通过使用glsl 4.0中的新功能
    子例程
    找到了一个好的解决方案。这是一个非常棒的特性!谢谢分享……:)