Opengl 着色器的多个实例

Opengl 着色器的多个实例,opengl,opengl-es-2.0,glsl,Opengl,Opengl Es 2.0,Glsl,我最近读到你可以 “具有多个OpenGL着色器实例” 但没有提供其他细节 我想澄清一下这到底意味着什么 首先,我知道可以运行多个GLP程序,并且可以在它们之间切换。这是指所有这些吗?我假设在每个帧的多个创建的着色器程序之间切换基本上意味着我“同时”使用多个程序 或者它是指拥有同一着色器程序的多个“实例”?那对我来说毫无意义 这里有一些基本的澄清 创建程序对象时,将多个着色器链接在一起。通常至少有一个顶点和一个片段着色器。现在假设您要渲染,假设某个对象周围有一些辉光。该辉光将由不同的片段着色器创建

我最近读到你可以

“具有多个OpenGL着色器实例”

但没有提供其他细节

我想澄清一下这到底意味着什么

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

或者它是指拥有同一着色器程序的多个“实例”?那对我来说毫无意义


这里有一些基本的澄清

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


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

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


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

HeHe,+1,我太晚了;)在单帧过程中多次在着色器程序之间切换是否“正常”,例如,使用一个程序渲染发光对象(在示例中),而使用其他程序渲染其他对象;基本上,您将更改程序并进行单独的绘制调用,所有这些调用都在同一帧内。我认为这很常见?它会影响性能。您应该尽可能减少程序切换。通常在图形引擎中通过材质排序来完成。@SebbyJohanns这是最终使用不同着色器渲染对象的唯一方法,因此是的,这是正常的。但Michael是对的,因为您通常尝试使用某种基于渲染状态的排序来减少程序开关(以及其他开关,如纹理绑定)。另一个选项是单个着色器程序,该程序可以基于制服的值在多种模式下运行(对于每个对象,您仍然会尝试不更改制服的值)。但是,如果特定模式太不同,并且需要增加着色器程序本身的运行时间,那么这将不起作用。呵呵,+1,我太晚了;)在单帧过程中多次在着色器程序之间切换是否“正常”,例如,使用一个程序渲染发光对象(在示例中),而使用其他程序渲染其他对象;基本上,您将更改程序并进行单独的绘制调用,所有这些调用都在同一帧内。我认为这很常见?它会影响性能。您应该尽可能减少程序切换。通常在图形引擎中通过材质排序来完成。@SebbyJohanns这是最终使用不同着色器渲染对象的唯一方法,因此是的,这是正常的。但Michael是对的,因为您通常尝试使用某种基于渲染状态的排序来减少程序开关(以及其他开关,如纹理绑定)。另一个选项是单个着色器程序,该程序可以基于制服的值在多种模式下运行(对于每个对象,您仍然会尝试不更改制服的值)。但是,如果特定模式太不同,并且着色器程序本身的运行时间增加了,那么这将不起作用。