编辑:
起初我的问题不清楚,我将尝试重新表述:
如何使用不同的着色器对同一网格多边形执行不同的渲染操作?例如,我想使用一个着色器添加照明,并使用另一个着色器添加雾。我需要在第二个着色器的计算中使用从第一个着色器插入的颜色,但是如果我不能(或者不应该)在两个着色器之间传递颜色缓冲区,我不知道该怎么做。 另外(这是我的问题开始的地方),两个着色器都需要相同的世界视图投影计算,因此我应该分别在每个着色器中对其进行计算吗?我是否应该在所有渲染操作中使用一个大着色器?
原始问题:
说我有两个不同的着色器程序。第一个计算顶点着色器中的顶点位置,然后在片段着色器中执行一些操作。
比方说,我想使用片段着色器进行不同的计算,但是我仍然想使用由第一个顶点着色器计算出的相同顶点位置。我是否必须再次计算顶点位置,还是可以在不同的着色器程序之间共享状态?
答案 0 :(得分:1)
您有更多选择:
多次通过
此对象通常首先将几何图形渲染到深度和“颜色”缓冲区中,然后在下一遍中将其用作输入纹理,以渲染覆盖整个屏幕/视图的单个矩形。 延迟阴影就是一个例子,但是还有许多其他与延迟阴影无关的效果。这里是多次通过的示例:
首先通过渲染行星,恒星和物体,然后添加大气。
您可以通过混合或直接渲染来组合通道。直接渲染要求您渲染每个通道的纹理并在最后一个通道中渲染。混合会改变每次通过时输出的颜色。
单次通过
您描述的内容更像是应该将不同的着色器编码为单片段着色器的函数...是的,如果兼容,则可以将更多的着色器组合为一个,并将其结果组合为最终的输出颜色。
大着色器会影响性能,但我认为它比比多次通过都快得多。
看看这个例子:
这是计算环境反射,照明,几何颜色并将它们组合为单一输出颜色的方法。
异域着色器
还有一些特殊的着色器会绕过这种管道限制:
哪些用于GL / GLSL管道中不可能实现的东西。无论如何,如果局限性太强了,您仍然可以使用计算着色器...