Skip to main content

材质

概念

Material(材质)是Unity中定义物体表面视觉属性的资源,通过结合着色器(Shader)纹理(Texture),控制物体如何反射光线、显示颜色等效果。

核心组成

  • Shader:决定光照计算和渲染逻辑(如Standard Shader用于PBR材质)。
  • Texture:提供表面细节(如颜色贴图、法线贴图)。
  • 属性参数:颜色、金属度、光滑度等,通过Shader暴露的可调参数。

面试题

1. 材质与纹理的区别

  • 纹理:2D图像数据(如PNG/JPG),仅提供颜色或凹凸信息。
  • 材质:整合纹理、Shader及属性,决定最终渲染效果。例如,金属材质可能使用金属度贴图高光贴图

2. 材质、Shader、纹理的关系是什么?

答案

  • Shader是计算光照和颜色的程序;纹理是输入图像;材质是Shader和纹理的容器,绑定具体参数。
  • 关系链:Shader定义渲染规则 → 材质配置Shader参数和纹理 → 纹理提供细节数据 。

3. 如何动态创建并应用材质?

注意:动态修改material会创建实例,避免性能问题可用sharedMaterial

// 创建材质并设置属性
Material mat = new Material(Shader.Find("Standard"));
mat.color = Color.red;
mat.SetTexture("_MainTex", myTexture);
// 应用到物体
GetComponent<Renderer>().material = mat;

4. PBR材质的关键属性有哪些?

答案

  • Albedo:基础颜色(反照率)。
  • Metallic:金属度(0-1,非金属如塑料为0)。
  • Smoothness:表面光滑度(影响高光范围)。
  • Normal Map:模拟表面凹凸。 (PBR材质通过物理参数实现真实感)

5. 如何优化材质性能?

方法

  • 合批(Batching):使用相同材质的物体合并DrawCall。
  • Mipmap:为纹理生成多级分辨率,减少远处渲染开销。
  • 简化Shader:移动端避免复杂光照计算 。

6. 材质中Rendering Mode的选项及作用?

选项

  • Opaque(不透明):默认模式,如石头、金属。
  • Transparent(透明):用于玻璃、水。
  • Cutout(镂空):带Alpha通道裁剪(如树叶)。
  • Fade(渐变):透明度可动态变化 。

7. 法线贴图与高度贴图的区别?

  • 法线贴图:通过RGB编码表面法线方向,模拟凹凸(不改变模型形状)。
  • 高度贴图:灰度图定义实际高度位移,需曲面细分支持 。

8. 动态换色如何实现?

方案

  • 使用MaterialPropertyBlock修改颜色而不创建新材质:
MaterialPropertyBlock props = new MaterialPropertyBlock();
props.SetColor("_Color", Color.blue);
GetComponent<Renderer>().SetPropertyBlock(props);

(避免实例化材质,提升性能)

9. URP/HDRP中材质的差异?

  • URP:简化Shader,支持移动端,属性如Lit Shader替代Standard。
  • HDRP:支持次表面散射、光线追踪等高级特性 。

10. Shader Graph的作用?

答案:可视化编辑Shader,无需编写代码,适合美术人员调整复杂效果(如溶解、边缘光) 。