当将多个纹理应用于网格时(例如凹凸贴图),我通常将纹理绑定到前几个固定纹理单元,例如:diffuse = unit 0,bump = unit 1,specular = unit 2,然后继续将其重复使用具有不同纹理的不同网格。但是我一直想知道为什么glActiveTexture支持这么多的纹理单元(在上一个链接中,它至少说80个)。为每个可用的单元添加纹理并保持启用状态,只需更新统一采样器索引即可。通过减少纹理开关的数量,可以提高渲染性能。如果您的纹理少于最大纹理单位,则不必取消绑定纹理。采用这种方法是否会对性能产生不明显的影响?也许是内存开销?

#1 楼

现代硬件实际上并没有OpenGL公开的纹理绑定点的概念。而是,着色器单元使用描述符(这只是某种类型的胖指针),只要它驻留在视频内存中,它就可以潜在地寻址任何纹理。这就是使无绑定纹理之类的事情成为可能的原因。因此,当前实现中可用的大量“纹理单元”只是试图动手处理API的这一现已不相关的部分。 (避免重新绑定纹理)是使用纹理数组,只要它们具有相同的格式和大小,就可以在着色器中动态索引到一组纹理。本演示文稿包含有关使用现代OpenGL渲染时减少驱动程序开销的这些及其他技术的更多详细信息:接近零驱动程序开销

评论


$ \ begingroup $
我以前看过那个演示文稿,非常好。我不知道您在第一段中提到的内容,因此感谢您提供该信息!
$ \ endgroup $
–glampert
15年8月25日在1:39