iOS上OpenGL ES 2.0中每个程序的纹理单位说明

iOS上OpenGL ES 2.0中每个程序的纹理单位说明,ios,opengl-es,Ios,Opengl Es,根据苹果关于OpenGL ES 2.0限制的文档: 这似乎不太具体,所以我假设它的意思是,“对于片段着色器的每个过程,最多可以引用8个纹理单位。” 所以我一直在做的是,在片段着色器的给定过程中,我只引用一个纹理单元,从纹理单元0开始。下一关,我参考第1单元。下一关,第二单元,等等。基于我的上述假设,这应该适用于多达GL\u MAX\u组合纹理\u图像\u单位。 然而,它似乎只工作到第7单元,并在任何>=第8单元时中断 这听起来会让我达到最大的纹理单位吗?还是我遗漏了什么 如果我确实达到了片段着

根据苹果关于OpenGL ES 2.0限制的文档:

这似乎不太具体,所以我假设它的意思是,“对于片段着色器的每个过程,最多可以引用8个纹理单位。”

所以我一直在做的是,在片段着色器的给定过程中,我只引用一个纹理单元,从纹理单元0开始。下一关,我参考第1单元。下一关,第二单元,等等。基于我的上述假设,这应该适用于多达
GL\u MAX\u组合纹理\u图像\u单位。

然而,它似乎只工作到第7单元,并在任何>=第8单元时中断

这听起来会让我达到最大的纹理单位吗?还是我遗漏了什么

如果我确实达到了片段着色器中允许的纹理单位的上限,我想我要做的是保存一个可变的程序数组,并在运行时根据我定义的纹理数量构建尽可能多的程序,当我达到纹理单位索引的步骤(是8的倍数)时,切换到适当的程序


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

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

+ (GLint)maximumTextureUnitsForThisDevice;
{
    GLint maxTextureUnits; 
    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
    return maxTextureUnits;
}
在我拥有的最强大的设备——视网膜iPad上运行这个程序,我最多可以得到8个纹理单位。这意味着您将无法将纹理绑定到高于
GL_TEXTURE7
的任何对象,并将可同时馈送到着色器的纹理数限制为8


然而,正如Tim在评论中所建议的,如果你一次只需要访问一个纹理,没有什么能阻止你将每个纹理顺序绑定到一个单元,并对其进行处理,然后将下一个纹理绑定到同一个单元。

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

+ (GLint)maximumTextureUnitsForThisDevice;
{
    GLint maxTextureUnits; 
    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
    return maxTextureUnits;
}
在我拥有的最强大的设备——视网膜iPad上运行这个程序,我最多可以得到8个纹理单位。这意味着您将无法将纹理绑定到高于
GL_TEXTURE7
的任何对象,并将可同时馈送到着色器的纹理数限制为8


然而,正如Tim在他的评论中所建议的,如果你一次只需要访问一个纹理,那么没有什么能阻止你将每个纹理顺序绑定到一个单元,处理它,然后将下一个纹理绑定到同一个单元。

如果每个过程只使用一个纹理,那么为什么不在每个过程之后绑定一个新纹理呢?我搞不懂你为什么认为你需要不断增加纹理单元数。太好了!因为我的理解是完全错误的。我假设将一个纹理指定给一个给定的单位会产生将纹理数据发送到opengl的成本,所以我不想在使用纹理后切换单位。现在我总是使用单元0,它解决了我在>8时遇到的任何问题。我正在慢慢地沿着学习曲线向上爬,所以感谢你指出这一点。如果每个过程只使用一个纹理,那么为什么不在每次过程后绑定一个新的纹理呢?我搞不懂你为什么认为你需要不断增加纹理单元数。太好了!因为我的理解是完全错误的。我假设将一个纹理指定给一个给定的单位会产生将纹理数据发送到opengl的成本,所以我不想在使用纹理后切换单位。现在我总是使用单元0,它解决了我在>8时遇到的任何问题。我正在慢慢地沿着学习曲线向上爬,所以谢谢你指出这一点。谢谢你的代码片段,看起来它对所有的glGet都很有用。因此,我是否可以安全地假设,只要我在一个片段着色器过程中引用的纹理不超过8个,我可以用来绘制一帧的纹理的数量仅受我所在设备的内存限制?如果我没弄错的话,事情可能就开始有意义了。@jankins-是的,如果你要分多个步骤进行渲染的话。纹理单元限制只会影响将多个纹理输入到单个渲染过程的能力。感谢您的代码片段,这看起来对所有glGet都很有用。因此,我是否可以安全地假设,只要我在一个片段着色器过程中引用的纹理不超过8个,我可以用来绘制一帧的纹理的数量仅受我所在设备的内存限制?如果我没弄错的话,事情可能就开始有意义了。@jankins-是的,如果你要分多个步骤进行渲染的话。纹理单位限制只会影响将多个纹理输入到单个渲染过程的能力。