1

根据 Apple 的 OpenGL ES 2.0 限制文档: “您可以在片段着色器中使用多达 8 个纹理。”

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

所以我一直在做的是在我的片段着色器的给定通道中,我只引用一个纹理单元,从纹理单元 0 开始。下一个通道,我引用单元 1。下一个通道,单元 2,依此类推. 根据我的上述假设,这应该可以正常工作GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

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

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

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

这听起来合理吗,还是我错过了什么?

4

1 回答 1

1

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

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

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

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

于 2012-08-02T15:00:34.413 回答