这可能看起来很愚蠢,但却使我烦恼。据我了解,多重纹理化每个着色器仅使用一种以上的纹理(通常以某种方式进行混合)。因此,我没有创建2个纹理,而是创建了2个或更多纹理,这很明显!
为什么有一个特殊的术语呢?除了“使用多个纹理”之外,还有更多的功能吗?我想念什么吗?
这可能看起来很愚蠢,但却使我烦恼。据我了解,多重纹理化每个着色器仅使用一种以上的纹理(通常以某种方式进行混合)。因此,我没有创建2个纹理,而是创建了2个或更多纹理,这很明显!
为什么有一个特殊的术语呢?除了“使用多个纹理”之外,还有更多的功能吗?我想念什么吗?
Answers:
这个特殊术语与图形卡和实时图形API的发展有关,而不是那么特殊。例如,图像处理和离线图形渲染早在实时图形API和消费者级硬件中就具有此功能。
自OpenGL 1.1(固定功能)以来,多重纹理已作为API的新状态引入。它不仅可以绑定一个纹理,还可以绑定多个纹理。每个纹理单元一个,然后使用纹理环境参数之一在它们之间进行混合,混合,调制..etc 1
然后引入了纹理组合器,它使您能够使用更灵活的操作来组合一组纹理,方法是将参数传递给一组固定的操作(将其视为着色器,但具有一组固定的参数),这是比原始的“合并器”更灵活。
随着着色器的引入,以前的组合器变得多余,直到正式弃用为止。最终,将纹理采样器传递给着色器并让GPU 对纹理执行任意操作(您的着色器)变得比以前更加灵活,变得不那么容易了(随着硬件和相应的API的发展)。
这里的重点;即使它变得微不足道,该术语也仍然是描述多个纹理的采样和卷积的任何操作的通用术语。
1我正在使用内存来回忆OpenGL固定功能,如果错过的话请纠正我。
历史原因是“多重纹理”曾是一个流行术语,例如“硬件TnL”。由于它是新卡的显着特征,因此需要有一个单词来出售它们。
技术原因是多纹理化不仅是创建和使用两个纹理,还不是一个。如果仅使用两个纹理(或三个或任意数目),则也可以只使用一个纹理,因为只有一个输出片段。这没有什么区别(无论输入是什么,输出只能是一个或另一个),因此没有什么特别的。
不同之处不是可以创建多个纹理,而是可以组合两个或多个纹理。例如,您可以基于Alpha或基于每个顶点插值的混合因子来混合它们,或者可以添加它们或其他一些东西。
可配置/可编程的数量在过去十年有了很大发展,但一个很大的区别仍然是可以在某种程度上两个或多个输入组合成一个输出。
刚开始有光
具体来说,OpenGL照明指定了要应用于片段的某些数学运算,然后将其与纹理组合以得出最终颜色。
然后是雷神之锤
雷神之锤并未对许多物体使用这种照明。取而代之的是,它使用第二个纹理表示照明,将其与对象纹理相乘(或“调制”)以得出最终颜色。
但是,当时的硬件在单个操作中不支持此功能。因此Quake需要绘制两次场景对象:
这当然很慢。不仅需要对所有几何图形进行两次变换和修剪(在当时是CPU操作),而且在渲染过程中屏幕上的每个像素最终都被触摸了两次。
输入多纹理
多重纹理是解决此问题的方法,最初是通过GL_SGIS_multitexture扩展公开的,该扩展仅存在于某些消费3DFX卡上。最初,它仅允许混合两个纹理(并具有一组有限的混合模式)。
引用原始GLQuake自述文件:
GL_SGIS_multitexture多
纹理支持允许某些硬件以一遍而不是两遍渲染世界。GLQuake使用两次通过,一次用于世界纹理,第二次用于混合在纹理上的光照贴图。在某些硬件上,通过支持GL_SIGS_multitexture的OpenGL实现,可以一次性完成此操作。在支持此功能的硬件上,帧速率将提高60%到100%。当前,只有3DFX双TMU卡(例如Obsidian 2220)支持此扩展,但是其他硬件很快就会问世。
重要的是要记住,此时还不存在诸如法线贴图,任何其他类型的每像素照明甚至着色器之类的效果(它们确实存在,但主要是在学术论文和研究项目中,以及在实时渲染中不可行)。
到现在
从这里开始,这几乎与其他答案中所描述的一样。随着时间的推移,多重纹理成为标准功能,更多混合模式可用,最终让位于任意着色器代码。
但是,对于您的问题而言,重要的是:一开始,标准功能只能在渲染时一次使用一个纹理。能够使用多个功能是仅高端硬件支持的附加功能,因此需要命名。该名称可能是“双重纹理”(因为第一个实现仅支持两种纹理),但出于对未来的关注,选择了“多重纹理”名称。
在此处可以找到有关所有这些内容的历史的进一步阅读,以及在此Programmers.SE答案中的优秀历史文章(涉及更广泛的背景以及其中涉及的多重纹理化)。