Ima*_*deh 0 c++ opengl shader glsl
我使用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
Run Code Online (Sandbox Code Playgroud)
可以绑定到OpenGL的纹理数量不是32或16.这不是你得到的glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);.该函数检索片段着色器可以访问的纹理数.
看,每个着色器都有自己可以使用的纹理数量限制.但是,还有一些可以使用的纹理总数,周期.这是在(在OpenGL中)定义的GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.
所以有两个限制:每阶段纹理和纹理总数限制.
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);
Run Code Online (Sandbox Code Playgroud)