【问题标题】:Clarification on Texture Units Per Program in OpenGL ES 2.0 on iOSiOS 上 OpenGL ES 2.0 中每个程序的纹理单元的说明
【发布时间】:2017-08-15 18:28:54
【问题描述】:

根据 Apple 的 OpenGL ES 2.0 限制文档: "You can use up to 8 textures in a fragment shader."

这似乎不是特别具体,所以我假设它的意思是,“您可以为片段着色器的每个通道引用最多 8 个纹理单元。”

所以我一直在做的是,在我的片段着色器的给定通道中,我只引用一个纹理单元,从纹理单元 0 开始。下一个通道,我参考单元 1。下一个通道,单元 2,等等。根据我的上述假设,这应该适用于 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

但是,它似乎只在第 7 单元之前有效,并且在任何 >= 单元 8 处中断。

这听起来会导致我达到最大纹理单位吗?还是我错过了什么?

如果我确实达到了片段着色器中允许的纹理单元的上限,我想我要做的是保存一个可变的程序数组,并在运行时为我需要多少纹理构建尽可能多的程序'已经定义了,当我点击纹理单元索引的步数是 8 的倍数时,切换到适当的程序。

这听起来合理吗,还是我遗漏了什么?

【问题讨论】:

  • 如果每个 pass 只使用一个纹理,那么为什么不在每个 pass 之后绑定一个新的纹理呢?我很困惑为什么你认为你需要不断增加纹理单元号。
  • 太棒了!因为我的理解是完全错误的。我假设将纹理分配给给定的单元会产生将纹理数据发送到 opengl 的成本,因此我不想在使用纹理后切换单元。现在我一直在使用单元 0,这解决了我在大于 8 时遇到的任何问题。我正在慢慢爬上学习曲线,所以感谢您指出这一点。

标签: ios opengl-es


【解决方案1】:

您可以通过以下方式查询设备上纹理单元的最大数量:

+ (GLint)maximumTextureUnitsForThisDevice;
{
    GLint maxTextureUnits; 
    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
    return maxTextureUnits;
}

在我拥有的最强大的设备 Retina iPad 上运行它,我最多可以获得 8 个纹理单元。这意味着您将无法将纹理绑定到高于 GL_TEXTURE7 的任何内容,并将可以同时输入着色器的纹理数量限制为 8 个。

但是,正如 Tim 在他的评论中所建议的那样,如果您一次只需要访问一个纹理,那么没有什么能阻止您将每个纹理依次绑定到单个单元、处理它,然后将下一个纹理绑定到该单元同一单位。

【讨论】:

  • 感谢代码 sn-p,看起来它对所有 glGet 都有用。所以我可以安全地假设我可以用来绘制一帧的纹理数量,只要我在一个片段着色器通道中从不引用超过 8 个纹理,只受我所在设备的内存限制的限制吗?如果我做对了,事情可能会开始变得有意义。
  • @jankins - 是的,如果您要分多个步骤进行渲染。纹理单元限制只会影响您将多个纹理输入到单个渲染通道的能力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2012-06-25
  • 2011-05-19
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多