材质
概念
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,无需编写代码,适合美术人员调整复杂效果(如溶解、边缘光) 。