材质和纹理有什么区别?

28

在计算机图形学中,材质和纹理有什么区别?

4个回答

40
在OpenGL中,一个材质是由一组系数定义的,这些系数定义了光照模型与表面的相互作用方式。特别地,针对每种颜色分量(R,G,B),定义并应用了环境、漫射和镜面系数,并有效地乘以击中表面的每种/颜色的光线数量。然后添加最终的发射系数到每个颜色分量上,使物体看起来发光而不需要实际与其他物体交互。
另一方面,纹理是一组1、2、3或4维位图(图像)数据,根据顶点的纹理坐标应用和插值到表面上。无论是否启用光照(取决于纹理模式,如贴花、调制等),纹理数据都会改变表面的颜色。纹理通常用于为表面提供子多边形级别的细节(例如将重复的砖块和砂浆纹理应用于四边形以模拟砖墙,而不是建模每个单独的砖块的几何形状)。
在传统(固定管道)OpenGL模型中,纹理和材料有些正交。在新的可编程着色器世界中,这条线已经模糊了很多。通常情况下,纹理被用于以其他方式影响光照。例如,凹凸贴图是一种纹理,用于扰动表面法线来影响光照,而不是像常规的“图像”纹理一样直接修改像素颜色。

24

这个问题表明了对各种计算机图形概念的普遍误解。这是源于传统着色器思维和编码方式。

纹理不过是一系列一个或多个图像的容器,其中每个图像都是一维、二维等维度值的数组,其中每个值可以是1到4个数字的向量。纹理还有一些特殊的访问值的技术,允许插值和最小化采样所产生的混叠伪影。

纹理可以包含颜色,但并不必须包含颜色。纹理可用于在对象表面上变化参数,但这并不是纹理可用于的全部。

纹理与“材质”没有直接关联;可以将它们用于各种各样的事情(或根本不用)。

材质是照明中的一个概念。给定特定的光源和表面上的一点,该点处反射的光照强度(即颜色)由一个照明方程控制。该方程是许多参数的函数。但这些参数分为两类。

一类光方程参数是光参数。它们描述光源的特性。点光源 vs. 定向光源 vs. 聚光灯。光强度(再次提醒:颜色)是另一个参数。由于强度本身可能根据表面点相对于光的方向而变化(想想手电筒或聚光灯),因此可以从纹理中访问该强度。这就是许多游戏在黑暗的房间中投射手电筒的方式。

光方程参数的另一类描述该点表面的特性。它们称为材质参数。材质参数,或简称材质,描述了该点表面的重要属性。该点法线是其中一个重要的属性。还有漫反射(颜色)、镜面反射、镜面光泽度(Phong/Blinn-Phong的指数)以及其他各种参数,具体取决于您的照明方程的综合程度。

这些值从哪里来?光参数通常在世界中是固定的。灯光不会随着每个物体移动(虽然如果您在物体空间中进行照明,则每个对象都将有自己的光源位置)。光强度可能会有所变化。但这基本上就是它了;任何其他变化都发生在帧之间,而不是在单个帧的渲染过程中。因此,大多数光参数都是着色器统一变量。
材料参数可以来自各种来源。有效地使用着色器统一变量意味着表面上所有点都具有相同的值。因此,您可以让漫反射颜色来自一个统一变量,这将给表面一个统一的颜色(当然,还要受到照明的影响)。您可以通过将其作为顶点属性传递或从其他属性计算它们来按顶点变化材料参数。
或者,您可以通过将纹理映射到表面来提供参数。该映射涉及将纹理坐标与顶点位置相关联,以便纹理直接附加到表面。在渲染期间,在该位置采样纹理,并使用该值执行照明。
您最熟悉的最常见的纹理,“颜色纹理”,仅仅是在表面上变化漫反射率。该纹理在表面每个点处提供漫反射颜色。
这不是纹理的唯一功能。您可以同样轻松地在表面上变化高光度或光强度。或者其他任何东西。
纹理是工具。材料只是一组光方程参数。

12

我对这些术语的理解:

纹理是映射到3D物体上的图像。

材质模拟物理材质。以“玻璃”为例,您无法使用简单的纹理映射产生玻璃效果。它具有不同角度反射和折射光线的参数。材质也可以是简单的纹理映射,因此有时这些术语意味着相同的意思。


6
虽然这些术语可以互换使用,但通常将位图称为纹理。
如果一个完全定义的纹理具有照明属性、凸凹映射等,则通常被称为材质。
但我应该强调,根据所使用的工具,相关社区将使用它们自己的术语。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接