【问题标题】:Multiple instances of shaders多个着色器实例
【发布时间】:2013-04-16 23:17:56
【问题描述】:

我最近读到你可以

“有多个 OpenGL 着色器实例”

但没有提供其他细节。

我想澄清一下这到底是什么意思。

首先,我知道您可以运行多个 glProgram,并且您可以在它们之间切换。这都是指的吗?我假设每帧在多个创建的着色器程序之间切换基本上意味着我“同时”使用多个程序。

或者它是否以某种方式引用了 same 着色器程序的多个“实例”?这对我来说毫无意义。

这里有一些基本的说明!

【问题讨论】:

    标签: opengl opengl-es-2.0 glsl


    【解决方案1】:

    当您创建一个程序对象时,您会将多个着色器链接在一起。通常至少有一个顶点和一个片段着色器。现在说你想渲染,说一些物体周围的发光。该发光将由不同的片段着色器创建,但顶点着色器将与常规外观相同。现在,为了节省资源,您可以在多个程序中使用相同的顶点着色器,但链接不同的片段着色器。当然,您也可以使用相同的片段着色器和不同的顶点着色器。

    简而言之,您可以将单个着色器链接到任意数量的程序中。只要链接的着色器阶段相互兼容,这有助于模块化。

    【讨论】:

    • 呵呵,+1,我来晚了;)
    • 在单帧传递期间多次在着色器程序之间切换是否“正常”,这样您的发光对象(在您的示例中)使用一个程序渲染,而其他对象使用其他程序渲染;本质上,您将在同一框架内更改程序并进行单独的绘图调用。我认为这很常见?
    • 会影响性能。尽量减少程序切换。一般是在图形引擎中通过素材排序完成的。
    • @SebbyJohanns 这最终是使用不同着色器渲染对象的唯一方法,所以是的,这是正常的。但是 Michael 是正确的,因为您通常会尝试使用某种基于渲染状态的排序来减少程序开关(和其他开关,如纹理绑定)。另一种选择是单个着色器程序,它可以根据制服的值在多种模式下运行(您仍然会尝试不为每个对象更改)。但是,如果特定模式差异太大,并且会增加着色器程序本身的运行时间,这将不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2014-07-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    相关资源
    最近更新 更多