Visual Studio 2015 中 OpenGL 4 实现中的纹理单元数 (GL_TEXTUREi)

Posted

技术标签:

【中文标题】Visual Studio 2015 中 OpenGL 4 实现中的纹理单元数 (GL_TEXTUREi)【英文标题】:Number of texture units (GL_TEXTUREi) in OpenGL 4 implementation in Visual Studio 2015 【发布时间】:2017-09-26 12:17:09 【问题描述】:

我使用 OpenGL 4 在 Visual C++ 中进行一些纹理操作。 我正在使用的平台是 Visual Studio 2015。在查看了 GL_TEXTUREi 纹理单元的实现后,我发现总数限制在 0 到 31(总共 32 个)。

是不是意味着可以同时访问的纹理的最大数量被限制为32?

这是来自实现源代码:

#define GL_TEXTURE0 0x84C0
#define GL_TEXTURE1 0x84C1
#define GL_TEXTURE2 0x84C2
#define GL_TEXTURE3 0x84C3
#define GL_TEXTURE4 0x84C4
#define GL_TEXTURE5 0x84C5
#define GL_TEXTURE6 0x84C6
...
#define GL_TEXTURE31 0x84DF

【问题讨论】:

相关/重复:How many textures can usually I bind at once?(我实际上不能投票为骗子,因为它来自 GameDev.SE) 【参考方案1】:

可以绑定到OpenGL的纹理数量是不是3216。这不是你通过glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units); 得到的。该函数检索片段着色器可以访问的纹理数量。

看,每个shader has its own limit of the number of textures it can use。但是,也有可以使用的纹理总数。这是由GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 定义的(在 OpenGL 中)。

所以有两个限制:每个阶段的纹理和纹理总数。

OpenGL 3.x 将每个阶段限制的最小数量定义为 16,因此硬件每个阶段的纹理不能少于 16 个。它可以有更高的限制,但你知道你至少得到 16。3.x 将纹理总数的最小数量定义为 48。AKA:16 * 3 个阶段。同样,GL 4.x 将数字定义为每个阶段 16 个纹理,以及总共 80 个纹理(即:16 * 5 个阶段)。

同样,这些是最小数字。硬件可以(并且确实)有所不同。

要使用比定义的枚举器更多的纹理单元,您可以获取 GL_TEXTURE0 的值并将其添加到您要操作的纹理单元中:

glActiveTexture(GL_TEXTURE0 + unit_index);

【讨论】:

以上是关于Visual Studio 2015 中 OpenGL 4 实现中的纹理单元数 (GL_TEXTUREi)的主要内容,如果未能解决你的问题,请参考以下文章