Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 我想声明一个统一数组而不指定它';s在一个着色器对象中的大小,同时在另一个着色器对象中声明它_Opengl_Glsl_Shader - Fatal编程技术网

Opengl 我想声明一个统一数组而不指定它';s在一个着色器对象中的大小,同时在另一个着色器对象中声明它

Opengl 我想声明一个统一数组而不指定它';s在一个着色器对象中的大小,同时在另一个着色器对象中声明它,opengl,glsl,shader,Opengl,Glsl,Shader,假设以下着色器: uniform float input[] float do_stuff(int index) { return input[index]; } 此代码使用某些数据执行某些操作,而不关心输入的大小但是,程序将与另一个着色器链接,该着色器将知道大小并调用它: void do_stuff(int); uniform float input[3]; void main() { gl_FragColor = vec4(do_stuff(input[0]),

假设以下着色器:

uniform float input[]
float do_stuff(int index) {
    return input[index];
}
此代码使用某些数据执行某些操作,而不关心
输入的大小但是,程序将与另一个着色器链接,该着色器将知道大小并调用它:

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”着色器都有不同的函数签名)。如果我可以创建这些未定义大小的统一,它会更容易


此外,我愿意接受建议……

这听起来像是一个挑战。你想用“做事”这个概念实现什么?你最终想解决什么问题?@Nicolas,在我写代码的前两段,举例说明了我想做的事情。我(尽管)的其他段落总结了我的问题:我有一些用户创建的处理,这个处理需要它自己的数据类型。此处理将由一些“实例”使用,每个实例填充数据,但请注意,编写着色器的用户不知道实例的数量。我的问题是,我不希望每次实例数更改时都重新编译用户着色器。无论如何,只要回答“不,这不是有效的glsl”就足够了。