【发布时间】:2014-02-26 18:32:16
【问题描述】:
我的片段着色器中有两个采样器数组:
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;等等),这些错误都不会发生。
【问题讨论】:
-
您如何访问这些采样器?请记住,根据您的 OpenGL 版本,不允许使用循环访问采样器数组。见:stackoverflow.com/a/12031821/988027
-
我实际上是在使用循环来访问它们。嗯...文章提到了数组纹理,但是samplerCubeShadow似乎没有纹理数组类型。这是否意味着我必须单独声明它们并通过 if 条件在循环内访问它们,还是有其他方法?
-
这意味着您必须对索引使用整数常量表达式。无论您做什么,最终都会出现在索引中,这对于 4.0 之前的版本很重要。只要您不使用循环计数器作为索引,运行循环就可以了。
-
谢谢,我已经解决了这个问题。如果我的着色器中有超过 16 个采样器,它仍然无法链接(同样,仅在我的带有 opengl 3.1 的笔记本电脑上)。有没有办法检索您可以拥有的最大采样器数量?
标签: opengl glsl fragment-shader