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)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Visual Studio 无法识别 is_open() 函数

在 Visual Studio 2015 中打开 Visual Studio 2017 项目

visual studio 2015怎样升级

visual studio 2015 怎么更新

使用 Visual Studio 2017 构建 open62541 DLL

Intel parallel studio 2017 集成在visual studio 2013 中,现在如何集成到visual studio 2015