OpenGL - 采样器阵列限制?

时间:2014-02-03 10:14:18

标签: opengl glsl fragment-shader

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

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

这在我的电脑上使用opengl 4.2工作正常,但在我的笔记本电脑上(opengl 3.1)我收到错误'数组太大'。

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

将数组大小降低到8后,编译工作正常,但链接无声地失败(日志为空,glGetError()返回0)。

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

1 个答案:

答案 0 :(得分:5)

你必须考虑两件事。

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

其次,引用OpenGL wiki page,您可以同时使用最大数量的纹理单位:

  

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

可能this answer会帮助你。特别是,请查看着色器resource limitations