你可以在同一个程序中有多个像素(片段)着色器吗?
你可以做这样做,例如通过从主入口点执行函数调用到各种着色器对象中实现的函数。
main() {
callToShaderObject1()
callToShaderObject2()
}
每个的那些callToShaderObject功能可以生活在不同的着色器对象,但是所有对象都具有附接和连接在同一程序中可使用之前。
他们不能在同一时间运行,但您可以*使用不同的着色器不同的几何形状,或者多个渲染使用不同的着色器通过。
所以就需要一个不同的程序?那么每个传球都有不同的计划?就像在一个程序中,我可以有一个顶点和片段着色器(这是一次传递?),然后在另一个程序上有顶点和片段着色器(第二遍?)?当我感觉喜欢它时,我可以只更改glUseProgram()吗?所以我本质上是渲染一个场景两次......? – Harry 2010-02-26 21:22:30
没错。就像固定管道中的多遍渲染一样,但不是在传递之间更改OpenGL设置,而是加载不同的程序。 – 2010-03-01 14:20:59
出于好奇心,你为什么要这么做,而不是简单地在片段着色器中使用所有函数呢?这是否可以让代码与其他着色器程序共享,而不必重复? – 2012-07-15 09:35:33
@尼克:我没有看到它用过我自己。当我第一次阅读规范时,我很惊讶地从着色器对象中构建着色器程序 - 因此,为什么我知道你可以做到这一点。它是从标准的编译模型建立... – Bahbar 2012-07-15 18:39:29
更新:我已经在使用中看到了这一点,现在,在研究改装成的Minecraft着色器。在这种情况下,它非常有用,因为每个着色器都有很多可以打开和关闭的选项,并且各种效果可以与其他各种效果结合使用。在这样的情况下,以及涉及多个作者的情况下,将功能分成单独的文件变得更有用。 – 2012-10-07 10:53:40