Answers:
可以绑定到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。又名:16 * 3个阶段。类似地,GL 4.x将数字定义为每阶段16个纹理,总数为96个纹理(即:16 * 6个阶段,包括计算着色器)。
同样,这些是最小数量。硬件可以(并且确实)有所不同。
对于特定的硬件,您可以期望任何DX10级的硬件都可以匹配这些数字。DX11类硬件有一些差异。NVIDIA(GeForce 4xx +)和更高端的AMD芯片(又名:GCN内核)可能每阶段超过16个。
我相信32是当前可以绑定的最大纹理数量。据我所知,即使8800系列也有32个纹理单元。
据我所知,要获得openGL 4.x支持,您将需要一张Fermi或更新的nvidia卡(或相应的amd卡),高端型号似乎都具有32个单元,而最低端型号(例如GT 430) )有16个。但是,在查看AMD规格表时,它们列出了80或128个纹理单元之类的编号,但列出了32色ROP单元,这些代数似乎一直保持不变。
另一方面,GTX 480列出了60个纹理单元和48个ROP单元,而据报道,像430这样的低端卡仅具有16个纹理单元和4个ROP初始化。因此,总的来说,我并不确定所有这些都是您真正想要的数字。
但是,您可以使用来检查可用于非固定功能管道渲染的纹理单元的数量glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);
,因此,如果您可以使用某些硬件,则可以进行检查。
编辑:此站点使您可以比较报告的各种视频卡的openGL功能,这应该为您提供所需的数字:http : //feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580
PS:AMD和nvidia最近推出了“无边界纹理”(amd的名称不同),它允许您使用大量纹理而不将其绑定到textutre单元,目前仅在openGL中可用。