【问题标题】:OpenGL - sampler array limit?OpenGL - 采样器数组限制?
【发布时间】: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


【解决方案1】:

你必须考虑两件事。

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

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

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

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

【讨论】:

  • GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS​ 在这种情况下并不是查询的最佳限制。还有一个每个阶段的限制:(例如GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS。桌面GL中的所有阶段都保证至少为16。但是这个限制实际上限制了可以在单个中使用的采样器的数量着色器调用,另一个限制是纹理图像单元的总数(GL3 中为 48+,GL4 中为 80+)。
  • 澄清一下,“纹理图像单元”不同于“图像单元”(ARB_image_load_store)?
  • OpenGL wiki 页面的链接已失效
猜你喜欢
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
相关资源
最近更新 更多