OpenGL - 采样器数组限制?

6

我在我的片段着色器中有两个采样器数组:

uniform sampler2D shadowMaps[12];
uniform samplerCubeShadow shadowMapsCube[12];

在我的pc上使用opengl 4.2非常好,但是在我的笔记本电脑(opengl 3.1)上却出现了“数组大小太大”的错误。

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

将数组大小降低到8后,编译可以工作,但链接失败而不发出任何声音(日志为空,glGetError()返回0)。

如果我单独声明每个采样器(uniform sampler2D shadowMap1; uniform sampler2D shadowMap2;等),则不会出现这些错误。


1
那么你是如何访问这些采样器的呢?请注意,根据您的OpenGL版本,使用循环访问采样器数组是不允许的。请参见:https://dev59.com/2Wct5IYBdhLWcg3whtuh#12031821 - Dan
事实上,我正在使用循环来访问它们。嗯...文章提到了数组纹理,但似乎没有samplerCubeShadow的纹理数组类型。这是否意味着我必须单独声明它们,并通过if条件在循环内访问它们,还是有其他方法? - Silverlan
2
你可能想要看一下这个链接:http://www.opengl.org/wiki/GLSL_Sampler#Non-uniform_flow_control - Dan
2
这意味着您必须使用“整数常量表达式”作为索引。无论您做什么,对于4.0之前的版本,最终在索引中使用的是什么才是最重要的。运行循环没问题,只要您不将循环计数器用作索引即可。 - Damon
谢谢,我现在已经解决了这个问题。如果我的着色器中有超过16个采样器(仅在我的OpenGL 3.1笔记本电脑上),它仍然无法链接。有没有一种方法可以检索您可以拥有的最大采样器数量? - Silverlan
1个回答

8

您需要考虑两件事情。

首先,请记住,根据您的OpenGL版本,使用循环内部的变量访问纹理采样器数组是不被允许的。请参见:https://dev59.com/2Wct5IYBdhLWcg3whtuh#12031821

其次,引用自OpenGL维基页面,您可以同时使用的纹理单元数量有一个最大值:

OpenGL上下文具有最大纹理图像单元数,可从常量GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS​​查询。

可能,这个答案会对您有所帮助。特别地,请查看着色器资源限制


4
在这种情况下,查询GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS不是最好的限制。每个阶段还有一个限制:(例如GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS)在桌面GL中的所有阶段中,它保证至少为16。但是,这个限制实际上限制了可以在单个着色器调用中使用的采样器数量,另一个限制是纹理图像单位的总数(GL3中为48+,GL4中为80+)。 - Andon M. Coleman
只是为了澄清,"纹理图像单元"与"图像单元"(ARB_image_load_store)是不同的吗? - jozxyqk
OpenGL维基页面的链接已经失效。 - Winter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接