跳转到内容

9. 材质和光的第一印象

约 10 分钟

第一个世界跑起来了:地板、墙壁、一个发光球。但走进去看一眼,灰白地板,雪白墙,冷淡的默认天空。像毛坯房,干净,没温度。

Material(材质)和 Light(光)决定玩家进门后第一眼看到的颜色和明暗。这章只动这两样。

目标很小:在同一个空间里改一下颜色和光的角度,亲身体会传达的情绪怎么变。

打开前面做好的房间,先改 Directional Light 的数值看变化。

选中场景里的 Directional Light,Inspector 里把 Intensity 从默认值改到 0.2。房间会暗下来。再改到 1.5,房间变得刺眼。接着把 Color 改成浅蓝色,整个空间偏冷;改成淡黄色,墙面立刻暖起来。

同一块地板,同一面墙,同一个发光球,只动一盏灯,感觉已经变了。

这里有一个很重要的直觉:物体看上去是什么颜色,由材质和光一起算出来,材质只决定其中一部分。

颜色是物体、光、角度三者的结果

Section titled “颜色是物体、光、角度三者的结果”

看到一个物体呈什么颜色,由三件事共同决定:

  1. 物体表面材质的底色(Albedo / Base Color)。
  2. 打在它身上的光是什么颜色。
  3. 光以什么角度和强度照过来。

同一面米白墙壁,暖黄灯下偏奶黄,冷蓝月光下偏灰蓝。墙没动,光一变,情绪就变。

所以搭空间时,调材质和调灯光要同时进行。只盯着材质调,最后常常出现「在 Scene 里好看,进 VRChat 之后怎么脏脏的」,多半是光把材质照坏了。

模型的形状由 Mesh 决定,视觉外观由 Material 决定。

同一个 Cube,穿上暗绿粗糙材质像铁盒,换成淡黄木纹像木料,换成半透明像玻璃。形状没变,观感完全不同。

会反复看到三个词:MaterialShaderTexture。按这个顺序理解就行:

  • Shader:一套渲染规则,告诉 GPU「这个表面要怎么被画出来」。
  • Material:一份具体配置,记录颜色、金属感、光滑度、贴图等参数。
  • Texture:贴图图片,比如木纹、砖缝、划痕、发光图案。

类比做饭:Shader 是做法,Material 是这一锅的调味比例,Texture 是具体食材的纹理。日常最常直接动的是 Material。

本书前期按 VRChat 世界项目里常用的内置渲染管线来走。Inspector 里有时显示 Albedo,有时显示 Base Map / Base Color,名字不完全一样,作用接近,都是表面的基础颜色。

  1. 在 Project 面板的 Assets 下新建文件夹 Materials
  2. 进入 Materials 文件夹,右键 CreateMaterial
  3. 命名为 Mat_Floor_WarmGray
  4. 选中这个材质球,Inspector 找到 Albedo(或 Base Map / Base Color)。
  5. 点色板,选一个偏暖的灰色。想精确一点,输入 #8A8178
  6. 把材质球从 Project 面板拖到 Scene 视图里的 Floor 上。

地板立刻变成暖灰色。Floor 的形状没动,Collider 也没动,只是换了表面视觉。

接着给墙也做一个:

  1. 新建 Mat_Wall_OffWhite
  2. Albedo 输入 #D8D2C4
  3. 拖到 Wall_LeftWall_Right 上。

如果还有后墙,也一起拖上去。墙从冷白变成米白,房间会少一点「默认工程」的味道。

材质面板字段很多,初学只看四个:

  • Albedo / Base Color:底色。初学阶段最常改这个。
  • Metallic:金属感。0 是非金属,木头、布料、墙面都接近 01 接近纯金属。
  • Smoothness:光滑度。低一点像水泥,高一点像抛光塑料或金属。
  • Emission:自发光。适合霓虹、屏幕、发光符号。

这些参数基于 PBR(Physically Based Rendering,基于物理的渲染)。墙、地板、木头这类普通物体,Metallic 放 0,Smoothness 保持低值(0.10.3)。

给地板试一组常用起点:Metallic = 0Smoothness = 0.25。给墙试 Metallic = 0Smoothness = 0.15

现在轮到 GlowBall

  1. 新建材质 Mat_GlowBall_Cyan
  2. Albedo 改成浅青色,输入 #6EE7F9
  3. 如果材质面板里有 Emission,勾上它,颜色也设成 #6EE7F9
  4. 把材质拖到 GlowBall 上。

勾了 Emission,球本身会看起来更亮。但这里要注意一个常被搞混的点:自发光材质看起来亮,不等于它在照亮周围。要照亮墙和地板,还得靠 Light 组件。

如果做霓虹灯时发现字牌亮了、墙没被照亮:多半是材质 Emission 自亮,但没有 Light 去照周围。材质亮和灯光亮是两件事。

纯色最容易控制整体基调:暖灰地板、米白墙壁、浅青发光球,三个颜色放在一起已经有了基本气氛。木纹砖纹后面再加。

先用纯色定冷暖,等氛围对了再细化材质。大关系先于细节,是三维美术里很实用的顺序。

可以把房间看成三块:地板负责稳定感,颜色可以深一点、灰一点;墙壁负责反光和背景,颜色可以浅一点、脏一点;发光球负责焦点,颜色可以更明确。

「脏一点」的意思是避开纯白。纯白墙在强光下很容易刺眼,也会让空间看着像没调过色的默认工程。

材质决定物体表面是什么底子,Light 决定这个底子怎么被看见。

Unity 里常见的几种 Light:

  • Directional Light:方向光,常用来模拟太阳或月亮。位置不重要,Rotation 才重要。
  • Point Light:点光源,像灯泡,从一个点向四周发光。
  • Spot Light:聚光灯,像手电筒或舞台灯,朝一个方向打出锥形光束。
  • Area Light:面光源,适合柔和的大面积光,但通常需要烘焙进 lightmap,前期先知道有它就行。

这一章只动前两个:Directional LightPoint Light。够用了。

场景默认的 Directional Light 可以先当作太阳。它有一个特点:位置无所谓,只有 Rotation 起作用。

选中 Directional Light,Transform 的 Rotation 设为:

X = 50
Y = -30
Z = 0

Light 组件里的参数调成:

Color #9AB4C8
Intensity 0.35

场景会变成偏冷的柔和底光。墙面和地板还能看清,但不再像正午白光直怼脸上。

X 轴角度控制太阳高度:90 接近头顶直射,30 更像低角度斜射。Y 轴控制水平朝向。在 Scene 视图里旋转它看阴影怎么移动,比照着角度表想象直观得多。

为什么 Directional Light 不在乎位置?因为它模拟的是远到不能再远的光源,比如太阳。太阳到地球的距离让到达房间的光近似平行,所以 Unity 只关心它朝哪照。如果让位置参与,每做一个大场景都得把「太阳」放到极远处,编辑很不方便。

Directional Light 的角度调低一点,墙角、球体、地板之间会出现明暗关系。空间开始有前后、有重量。

阴影是大脑判断三维深度的重要线索。没有阴影的场景看起来像纸片,所有东西都浮在同一个平面上。斜角光会拉出长一点的阴影,立体感自然更明显。

但阴影也贵。Unity 的实时阴影要每帧更新 shadow map。灯会动、物体会动、玩家也会动,阴影跟着算。学习阶段开着看效果没问题,做正式 VRChat 世界时要开始克制。

现在先用一条偷懒规则:主光开阴影,装饰性小灯关掉阴影。

Point Light 像一颗灯泡,光从中心向四周散开,距离越远越弱,超过 Range 后就不再照亮物体。

选中 GlowBall。如果它身上还没有 Light 组件,点 Add Component,搜索 Light,把 Type 设为 Point

试这组值:

Type Point
Color #FFE0B0
Intensity 2.5
Range 4
Shadows None

Build & Test 进去看看。模型还是那几块 Cube,全局 Directional Light 偏冷灰蓝,角落 Point Light 偏暖。明暗和色温已经分开:一块区域更亮、更暖,其余区域更暗、更冷。

不写一行代码,只靠 Material 和 Light,就能区分主区域和背景区域。

冷暖对比:最不容易翻车的一招

Section titled “冷暖对比:最不容易翻车的一招”

色板挑不定的时候,可以先试:冷调全局光 + 暖调局部光。全局光定整体色温,局部光把某一角提亮。也可以反过来:暖色全局光 + 冷色局部点缀。两种都是「一处亮、一处暗」,参数按房间尺寸改。

不同类型的世界,灯光服务的目标也不一样。休闲世界要让人放松,亮度低、对比柔,玩家才愿意久待;游戏世界要先保证识别,敌人、按钮、危险区必须看得清;展览世界更像博物馆布展,让作品本身做主角。同一个 Light 组件,目的不同,参数填法就不同。

如果担心玩家看不清,可以先把交互物体和主通道打亮,边缘暗一点没关系。所有地方同一亮度,层次会弱。

一个简单检查方法:把 Scene 视图缩小一点,眯着眼看。还能不能一眼看出哪里是视觉焦点?如果整个画面均匀发亮,说明灯太平均了。

实时灯光的计算成本不低。场景里每多一盏实时 Point Light,显卡就多一份运行时计算;如果还开实时阴影,成本更明显。VRChat 又是多人场景,玩家的 Avatar、镜子、视频播放器、粒子特效都会抢同一份性能预算。

学习阶段,两三盏灯没压力。先把效果做出来,理解光怎么影响空间。到后面的性能章节,会讲烘焙光照、Lightmap、Light Probe、Quest 版本怎么处理。

先记一个保守做法:

  • 主要环境光用 Directional Light
  • 少量局部重点用 Point Light
  • 装饰性发光物体优先用 Emission 表现,不一定都要配实时 Light。
  • 小灯默认不开阴影,除非它的阴影真的在服务体验。

Quest / Android 世界会更严格。官方优化建议会反复提醒控制材质、Shader、实时灯光和贴图成本。这些词后面都会讲到,现在只要知道:好看的光可以先做出来;跑得动的光,要靠后面那套优化方法把成本降下来。

如果改了颜色或灯光,场景里却没什么变化,按这个顺序查:

  1. 材质有没有真的拖到物体上?选中物体看 Mesh Renderer 里的 Materials 槽。
  2. 是不是还在 Play Mode 里调?退出后改动会还原。
  3. Light 的 Intensity 是不是太低?Range 是不是没覆盖到墙和地板?
  4. 物体是不是被别的强光照满了?一盏很亮的 Directional Light 会盖掉小灯效果。
  5. Scene 视图是不是开了某种调试显示模式?切回正常 Shaded 视图。

排查视觉问题先走三步:确认材质在不在、灯照不照得到、有没有另一盏灯把效果盖住。多数初学阶段的问题到这里就能定位。

自己改三版光照,先做再对比:

  1. 清晨:全局光偏冷、强度低一点,局部暖光也低一点。
  2. 午后:全局光更暖、更亮,阴影角度斜一些。
  3. 深夜:全局光很低,局部灯成为主要视觉焦点。

每做一版都 Build & Test 进去站一分钟。只在 Scene 视图看不够,VRChat 世界最终是站进去看的。有些在编辑器里「好像不错」的光,进 VR 后会太亮、太暗,或者方向怪。

加一个小挑战:三个版本只改 Material 和 Light,模型保持原样。这两样东西的力量会变得很清楚。


第二部到这里收束。GameObject、Component、Prefab、Material、Light 五个词,从空壳到外观到基础光照,够搭一个能走进去、有基本色温差别的房间。

理解章 B 把 Unity「空壳加零件」的思路串起来。