unity中的材质(material)贴图(texture)着色器(shader)介绍
@TOC
在unity中,材质(material)、贴图(texture)和着色器(shader)是构建和渲染3D对象外观的基本概念
材质(material)
- 定义:材质是一个用于定义物体外观的资源,它将材质属性(如颜色、纹理、光泽度等)与某种着色器结合起来,影响模型在场景中的视觉效果
- 主要组成部分:
- shader:材质使用的着色器,决定了如何对材质进行渲染
- color(颜色):包括主颜色,反射颜色等
- textures(贴图):图像文件,用于添加细节,图案和色彩
- properties(属性):不同的着色器可用的参数,控制材质的各种效果(如金属度,光泽度等)
- 创建材质
- 在project窗口中右键点击,选择create -> material
- 命名新材质,并在inspector面板中设置属性
- 或者通过代码设置:
// 1. 创建材质:使用代码动态创建和配置材质。
Material myMaterial = new Material(Shader.Find("Standard"));
myMaterial.color = Color.red;
myMaterial.SetTexture("_MainTex", myTexture);
// 2. 应用材质:将材质应用到游戏对象的 Renderer 组件上。
GameObject myGameObject = GameObject.Find("MyGameObject");
myGameObject.GetComponent<Renderer>().material = myMaterial;
贴图(texture)
- 定义:贴图是用于给材质提供表面细节的图像文件,贴图可以影响表面细节,颜色和其他效果
- 常见类型:
- Diffuse/Diffuse texture(漫反射贴图):用于定义物体表面的基础色彩
- Normal Map(法线贴图):用于模拟细微的表面细节和凹凸感,给物体增加深度感
- Specular Map(高光贴图):控制表面高光的强度和颜色
- Emisson Map(自发光贴图):让物体某些部分自行发光
- Bump Map(凹凸图):用灰度图像表示表面的凹凸
- 添加贴图:
- 将贴图文件导入unity项目(拖拽到project窗口)
- 选中你的材质,在inspector面板中找到对应的属性(如Albedo,normal map等)
- 将贴图文件拖到材质的相应属性槽中
- 也可通过代码添加
// 1. 导入贴图:通过代码加载贴图资源。
Texture2D myTexture = Resources.Load<Texture2D>("Textures/MyTexture");
// 2. 应用贴图:将贴图应用到材质的相应属性。
Material myMaterial = GetComponent<Renderer>().material;
myMaterial.SetTexture("_MainTex", myTexture);
着色器(shader)
- 定义:着色器是用来处理材质如何被渲染的程序代码,决定了最终的视觉效果,用于描述物体在光照和相机视角下的外观
- 类型:
- surface shader:比较简单,适合大多数情况,适合处理光照效果
- vertex shader:处理顶点的变换,常用于自定义物体的形状和姿态
- Fragment shader:处理像素级别的渲染计算,通常用于创建真实感的效果
- UI shader:专门为UI组件设计的着色器
- 使用和自定义着色器
- 选择材质,在Inspector中找到shader下拉菜单,选择一个合适的着色器(如standard/unlit等)
- 自定义着色器:
- 右键点击project窗口,选择create -> shader选择类型(如standard surface shader)
- 打开创建的shader文件,编辑代码,定义自定义的渲染效果
- 将自定义着色器应用于一个材质上,使其可以使用
代码动态创建和设置材质 综合示例
public class MaterialSetup : MonoBehaviour
{
public Texture2D mainTexture;
public Texture2D normalMap;
public Color albedoColor = Color.white;
public float metallic = 0.5f;
public float smoothness = 0.5f;
public Color emissionColor = Color.black;
void Start()
{
// 创建材质
Material myMaterial = new Material(Shader.Find("Standard"));
// 设置材质参数
myMaterial.color = albedoColor;
myMaterial.SetTexture("_MainTex", mainTexture);
myMaterial.SetTexture("_BumpMap", normalMap);
myMaterial.SetFloat("_Metallic", metallic);
myMaterial.SetFloat("_Glossiness", smoothness);
myMaterial.SetColor("_EmissionColor", emissionColor);
// 应用材质
GetComponent<Renderer>().material = myMaterial;
}
}