假设以下着色器:
uniform float input[]
float do_stuff(int index) {
return input[index];
}
这段代码使用一些数据做一些事情,而不关心input
. 但是,该程序将与另一个着色器链接,该着色器将知道大小并调用它:
void do_stuff(int);
uniform float input[3];
void main() {
gl_FragColor = vec4(do_stuff(input[0]),
do_stuff(input[1]),
do_stuff(input[2]),
1);
}
显然,这段代码很愚蠢,我只是创建它来演示我需要什么。我的真实情况是:“do stuff”着色器访问的数据未预定义,每个“do stuff”着色器都将拥有它自己的数据。此外,“do stuff”着色器不知道它会被调用多少次,所以它的输入是未定义大小的数组。另一方面,“调用者”着色器将在运行时生成,它确切地知道“do_stuff”着色器将使用哪些数据以及有多少。
实际上,“do stuff”着色器是用户提供的,而“caller”着色器将它们混合在一起。
因此,通过对“do stuff”着色器进行一些预处理,我可以使用参数解决我的问题,但这对我来说会变得更加复杂(因为每个“do stuff”着色器都会有不同的函数签名)。如果我可以创建这些未定义尺寸的制服,那就更容易了。
另外,我愿意接受建议...