Answers:
材料是描述给定材料表面外观的属性组合。
某些引擎对不同的材质使用不同的着色器,在这种情况下,材质定义可能如下所示:
[Material]
Shader=NormalMappedSpecular.glsl
Texture1=Rock.png
Texture2=RockNormal.png
Texture3=RockSpecular.png
其他引擎对所有对象都使用一个着色器(或者引擎根据参数,GPU的功能以及其他因素(例如距离)来决定使用哪种着色器),在这种情况下,材质看起来像这样:
[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png
甲材料指定对象如何响应于光。
有两个常用参数:
现在说您有一个用材质渲染的三角形M
。 M
Kd =(1,0,0)(红色漫反射),Ks =(1,1,1)(白色镜面反射),Ns = 25(镜面高光将非常清晰并且不会模糊)并且没有map_Kd(没有纹理)。
着色器的工作是使用数学方法得出三角形的顶点位置,灯光的位置,材质颜色值,并找出三角形应显示的颜色。顶点着色器在每个顶点执行一次“着色计算”,然后在三角形上插值颜色。
着色器中用于计算顶点扩散响应的常见操作是:
// hlsl
float3 vertexToLight = normalize( lightPos.xyz - vertexPos.xyz ) ;
float3 diffuseColor = max( dot( vertexToLight, vertexNormal ), 0.0 ) * kd * lightColor ;
材料是应用于几何图形的颜色和图案的材料。纹理是材料的组成部分。
着色器是一个小程序,它允许在运行时渲染此材质。着色器的好处是,您可以做所有事情,从简单地渲染材质到添加动态效果(例如高光高光和反射),一直到极其聪明的事情(例如在击中子弹的墙壁上渲染假孔)都可以。
因此,在回答您的问题时-是的,两者之间也有一些重叠-您可以制作红色材质或编写着色器以将事物渲染为红色,但是这两种方法都可以使您完成很多事情不能与其他。
不,您不需要每种材质一个着色器。尽管一种材质需要渲染着色器,但如果需要,您可以为所有材质使用一个材质球。他们会做一些特定的事情,因此,例如,如果您希望所有东西都闪闪发光,则可以只写一个。
着色器的一个很好的例子是战争工具。场景有一组材质,但是当您按下按钮切换到战术视图时,渲染这些材质的着色器会发生变化,因此外观看起来轮廓分明,并且通常有所不同。在蝙蝠侠中也发生了同样的事情:阿卡姆的“侦探模式”。
虽然很晚,但是有一个“骗子”可以帮助您更好地理解。
材质是为该绘制调用附加到特定着色器的所有内容。
例如,在上面的答案中,您具有以下材料:[Material] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png
它将翻译为您将使用执行法线贴图和镜面反射计算的着色器进行渲染,并且它将使用该着色器中的3个纹理。
稍后,您可以重复使用具有其他3种不同纹理(例如car,carNormal和carSpecular)的同一个着色器,您将使用不同的材质执行不同的绘制调用,只是因为更改了着色器参数。
总而言之,材料就是使用具有相同参数(纹理,均匀性,属性)的相同着色器唯一创建绘制调用的所有内容。
我希望这有助于更好地可视化它