@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;
    }
}
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐