使用所有可用的纹理单位是否是一种好习惯?


9

当将多个纹理应用于网格时(例如凹凸贴图),我通常将纹理绑定到前几个固定纹理单元,例如:diffuse = unit 0,bump = unit 1,specular = unit 2,然后继续将其重复使用具有不同纹理的不同网格。但是我一直想知道为什么glActiveTexture支持这么多的纹理单位(在上一个链接中,它至少说80个)。

因此,我想到管理纹理的一种可能方法是将不同的纹理绑定到每个可用的单元,并使它们保持启用状态,只是更新统一采样器索引。通过减少纹理开关的数量,可以提高渲染性能。如果纹理的数量少于最大纹理单位,则无需解绑纹理。

这是实时OpenGL应用程序的标准做法吗(我相信这也适用于D3D)?采用这种方法是否会对性能产生不明显的影响?可能是内存开销?

Answers:


11

现代硬件实际上并没有OpenGL公开的纹理绑定点的概念。而是,着色器单元使用描述符(这只是某种类型的胖指针),只要它驻留在视频内存中,它就可以潜在地寻址任何纹理。这就是使无绑定纹理之类的事情成为可能的原因。因此,当前实现中可用的大量“纹理单元”仅是试图动手处理API中与现在无关的部分。

也就是说,实现您要尝试执行的操作(避免重新绑定纹理)的推荐方法是使用纹理数组,只要它们全部具有,它们就可以在着色器中动态索引到一组纹理相同的格式和大小。本演示文稿包含有关使用现代OpenGL渲染时减少驱动程序开销的这些技术和其他技术的更多详细信息:接近零驱动程序开销


我以前看过那个演示文稿,非常好。我不知道您在第一段中提到的内容,因此感谢您提供该信息!
glampert
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.