OpenGL-采样器数组限制?

Sil*_*lan 4 opengl glsl fragment-shader

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

uniform sampler2D shadowMaps[12];
uniform samplerCubeShadow shadowMapsCube[12];
Run Code Online (Sandbox Code Playgroud)

这在使用opengl 4.2的计算机上可以正常工作,但是在我的笔记本电脑(opengl 3.1)上,我收到错误消息“数组大小太大”。

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

将数组大小减小到8后,编译工作成功,但是链接无提示失败(日志为空,并且glGetError()返回0)。

如果我分别声明每个采样器(统一sampler2D shadowMap1;统一sampler2D shadowMap2等),则不会发生这些错误。

Dan*_*Dan 5

您必须考虑两件事。

首先,请记住,根据您的OpenGL版本,不允许使用循环内的变量访问samplers数组。参见:https : //stackoverflow.com/a/12031821/988027

其次,引用OpenGL Wiki页面上的内容,可以同时使用最大数量的纹理单元:

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

此答案可能会为您提供帮助。特别是,请看一下着色器资源限制

  • 在这种情况下,“ GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS”不是最佳查询限制。每阶段还有一个限制:(例如,“ GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS”。对于桌面GL中的所有阶段,保证至少为16个。但是,此限制实际上限制了可在单个GL中使用的采样器的数量。着色器调用,另一个限制是纹理图像单元的总数(GL3中为48 +,GL4中为80+)。 (4认同)