iOS上OpenGL ES 2.0中着色器中的可变纹理单元数

iOS上OpenGL ES 2.0中着色器中的可变纹理单元数,ios,opengl-es,Ios,Opengl Es,我有N个纹理单元需要从片段着色器同时访问。N随加载的数据而变化。因此,在着色器中,我需要如下内容: // illegal syntax? uniform sampler2D tex[N]; 此外,OpenGL ES 2.0中似乎不支持sampler2DArray 只是想知道是否有其他技巧或GLSL预处理器构造可以用来实现上述目标 或者,动态生成着色器代码的更好选项是什么?我可以生成如下代码,并加载着色器: uniform sampler2D tex1; ... uniform sampler2

我有N个纹理单元需要从片段着色器同时访问。N随加载的数据而变化。因此,在着色器中,我需要如下内容:

// illegal syntax?
uniform sampler2D tex[N];
此外,OpenGL ES 2.0中似乎不支持sampler2DArray

只是想知道是否有其他技巧或GLSL预处理器构造可以用来实现上述目标

或者,动态生成着色器代码的更好选项是什么?我可以生成如下代码,并加载着色器:

uniform sampler2D tex1;
...
uniform sampler2D texN;

您可以尝试定义一个恒定的最大采样器数,并在运行时接收实际大小

uniform sampler2D tex[MAX_VALUE];
uniform int size;
int main(){
    ....
}

是否需要显式设置数组的大小?据我所知,您可以使用以下方法指定任意大小的采样器2D的统一数组:

uniform sampler2D tex[];
我认为它通常会按照您的预期工作,但没有明确设置大小。我正在使用此方法,但目前仅为数组提供一个纹理,并在代码后面使用其数组索引tex[0]引用它。还没有把所有的东西都建立起来,我已经准备好在那里放一个以上的纹理了,所以我不是100%在这个问题上


我对OpenGL非常陌生,因此定义我不知道的数组大小可能会有一些好处。

最大值的类型是什么?设置在哪里?我不认为上面的语法是合法的。MAX_值作为一个常量(16,32,64)不起作用,因为N取决于数据,如我所说。要执行上述操作,我需要动态生成着色器。此外,ES 2.0是否支持统一的采样器2D阵列?我对此表示怀疑。我不认为这将适用于超过1个纹理。这是在OpenGL ES 2.0上吗?我想你是对的,我在错误地阅读了非ES规范后写的。虽然纹理数组本身似乎是受支持的,但在示例6_3中学习OpenGL ES for iOS的书演示了如何使用语法
uniform sampler2D u_unit2d[MAX_TEXTURES]其中#define MAX_TEXTURES 2在着色器顶部定义,因此它仍然不是变量。另外,Brad Larson在他的GPUImage库中修改了GLP程序,以支持从NSString加载着色器,这可能有助于动态构建着色器。