OpenGL-采样器数组限制?

OpenGL-采样器数组限制?,opengl,glsl,fragment-shader,Opengl,Glsl,Fragment Shader,我的片段着色器中有两个采样器阵列: uniform sampler2D shadowMaps[12]; uniform samplerCubeShadow shadowMapsCube[12]; 这在我使用opengl 4.2的pc上运行良好,但是在我的笔记本电脑(opengl 3.1)上,我得到了错误“数组大小太大” 如果我把它设置为8,它工作正常。但是,其他类型的数组可以大得多,我可以添加更多最大大小为8的采样器数组,而不会出现问题。那么,这个限制是如何确定的呢 将数组大小降低到8后,编译

我的片段着色器中有两个采样器阵列:

uniform sampler2D shadowMaps[12];
uniform samplerCubeShadow shadowMapsCube[12];
这在我使用opengl 4.2的pc上运行良好,但是在我的笔记本电脑(opengl 3.1)上,我得到了错误“数组大小太大”

如果我把它设置为8,它工作正常。但是,其他类型的数组可以大得多,我可以添加更多最大大小为8的采样器数组,而不会出现问题。那么,这个限制是如何确定的呢

将数组大小降低到8后,编译工作,但链接以静默方式失败(日志为空,glGetError()返回0)


如果我单独声明每个采样器(uniform sampler 2D shadowMap1;uniform sampler 2D shadowMap2;等等),则这两个错误都不会发生。

您必须考虑两件事

首先,请记住,根据您的OpenGL版本,不允许使用循环中的变量访问采样器数组。见:

其次,从中引用,可以同时使用最大数量的纹理单元:

OpenGL上下文具有最大数量的纹理图像单元,可从恒定的GL\u MAX\u组合的\u纹理\u图像\u单元查询​.


也许,它会帮助你。特别是,请查看着色器

那么,您如何访问这些采样器?请记住,根据您的OpenGL版本,不允许使用循环访问采样器阵列。请看:事实上,我使用了一个循环来访问它们。陛下文章提到了数组纹理,但samplerCubeShadow似乎没有纹理数组类型。这意味着我必须单独声明它们并通过if条件在循环中访问它们,还是有其他方法?您可能想看看这个:这意味着您必须对索引使用整型常量表达式。无论你还做了什么,对于4.0之前的版本来说,索引中的内容才是最重要的。只要不使用循环计数器作为索引,就可以运行循环。谢谢,我现在已经解决了这个问题。如果我的着色器中总共有16个以上的采样器,它仍然无法链接(同样,仅在我的笔记本电脑上使用opengl 3.1)。有没有办法获取您可以拥有的最大采样器数量?
GL\u max\u组合的\u纹理\u图像\u单位​不是查询的最佳限制。每个阶段也有一个限制:(例如,
GL\u MAX\u VERTEX\u TEXTURE\u IMAGE\u UNITS
。桌面GL中的所有阶段都保证至少有16个。但这个限制实际上限制了可以在单个着色器调用中使用的采样器的数量,另一个限制是纹理图像单元的总数(GL3中为48+,GL4中为80+)“纹理图像单元”与“图像单元”(ARB_image_load_store)不同。OpenGL wiki页面的链接已失效