接到一个“外景 3D卡通风格小镇街道”的需求时,我一开始觉得不过是个普通场景练习,真正动手才发现:这种看起来“很可爱、很简单”的卡通街景,恰恰是最容易翻车的类型。因为卡通风格的误差容忍度很低,比例差一点就变成“恐怖谷”,配色艳一点就显得廉价,街道空一点立刻像废弃片场。这类项目通常出现在短视频开场、游戏关卡、风格化动画短片甚至虚拟演播室背景里,需求方要的就是一眼能记住的“童话感”和“生活气”。如果你也想做一条能经得起细看的3D卡通小镇街道,这篇记录会把整个流程——从定风格、搭灰盒、做资产,到打灯、调后处理、踩坑返工——完整拆给你看。
1. 先回答三个问题:给谁看、什么比例、什么配色
1.1 场景用途决定了技术选型
做外景场景切忌一上来就建模型。我接到需求后做的第一件事,是确认这个“小镇街道”最终出现在什么载体里。同一段街道,放进电影级离线渲染片子和放进实时游戏关卡,资产规范完全不同。
我之前做过两个相似项目:一个是某品牌风格化宣传短片的开场外景,镜头沿街道推进大约6秒,最后落到一家面包店门口;另一个是某模拟项目X里的游玩关卡,玩家可以自由走动、进出几家店铺。前者我放开了做高模细节,用了不少高级贴图混合,反正离线渲染不吃性能;后者就老老实实按游戏资产标准来,每个模型控制三角形数量,道具全部合批,LOD和碰撞体一个不少。这里给一张当时的对比表:
| 需求类型 | 适用管线 | 资源预算 | 主要瓶颈 | 制作周期 |
|---|---|---|---|---|
| 离线动画/短视频外景 | 高模 + 手绘贴图,支持多次渲染 | 无实时压力 | 贴图细节、画面层次 | 相对宽松 |
| 实时游戏/互动场景 | 低模 + 模块化,注重合批与LOD | 有明确性能指标 | 三角面数、DrawCall、内存 | 紧,常要反复调 |
建议接到需求后先写一份一页纸的技术简报,把“用什么引擎、跑在什么设备、允许的三角面数、贴图分辨率上限”都列清楚,避免做完一版才发现跑不动或精细度不够。
1.2 卡通比例的锚点:人、门、层高和街道宽
卡通风格并不是“随便夸张”,它有非常明确的锚点,那就是人。人物身高决定门高,门高决定层高,层高决定建筑体量,建筑体量又决定街道宽度。很多新手做出来的卡通街道像“玩具摆件”,就是因为这些比例关系没有打通。
我当时定的标准是人物身高约1.05米(三头身Q版角色的常见高度),门高做到1.8米,店铺层高3米,两层楼总高约7.5米,街道宽度控制在8到9米。为什么街道不能太宽?越宽,两边的建筑在画面里就会越矮越小,卡通街道需要的那种“被可爱建筑包围”的包裹感会直接消失。反过来如果路太窄,镜头会显得压抑。宽高比大约做到1比1.2到1比1.5,既亲昵又不拥挤。下面是几个常用风格档,方便对照参数:
| 风格档位 | 人物身高 | 门高 | 楼层高度 | 街道宽度 | 整体观感 |
|---|---|---|---|---|---|
| 二头身Q版 | 0.75m | 1.2m | 2.2m | 5-6m | 像个玩具城 |
| 三头身Q版 | 1.05m | 1.8m | 3.0m | 8-9m | 童话里有生活感的街区 |
| 写实比例卡通 | 1.7m | 2.2m | 3.5m | 10-12m | 动画电影质感,更“正” |
这一列数字不是死的,但一开始最好按这个区间去搭灰盒,后期微调比反复重搭要省事得多。
1.3 配色板要先于模型定下来
很多人直接凭感觉给墙刷颜色,结果整条街像被打翻的调色盘。卡通风格的关键是“高明度、低纯度、少色相”。我的做法是直接做一个6到8色的配色方案,核心思路是:主色占六成,副色占三成,点缀色占一成。
小镇街道常用的一个很稳的配方是:墙面用暖米色系,屋顶用砖红或深牛仔蓝,木结构用可可棕,植物用灰绿到墨绿过渡。点缀色给店铺招牌、雨棚和路灯,比如门头用一点红色或明黄色,整条街立刻有跳跃感。这个场景最终用了暖橙阳光下的米色墙、酒红屋顶和蓝灰色窗框,路边点缀几组亮黄色招牌。为了验证配色,我会在灰盒阶段直接在模型上刷纯色材质,从远、中、近三个距离截图看颜色关系,有刺眼的地方马上换。
2. 灰盒阶段就该想清楚的事:布局、相机与街道动线
2.1 先画一张街道总平面,再做灰度Blockout
我习惯先在俯视图里把街道布局画出来。直线型街道做起来最快,但最容易呆板;L型街道或带有丁字路口的布局,能在镜头推进时不断露出新内容,观众的视线有东西可抓。这条小镇街道我最终选了带有轻微弧度的L型布局,主街大约80米长,中间有一个小广场和一棵大树作为视觉中转点。
灰度Blockout的步骤很简单:地面用一个大平面铺好,建筑全部用标准立方体代替,按刚才锁定的层高和街道宽度放进去。先不用管窗户和门,只确认三件事:建筑之间的间距是否均匀、街角有没有转角建筑、大面积墙面是不是都被细节道具切碎了。这一步我用的是最普通的立方体加三种纯色材质:地面深灰色、建筑浅灰色、树和道具中灰色。反复切顶视图和透视图看,直到“街道轮廓线”有节奏感。
2.2 镜头动线决定建筑立面的朝向和细节
很多场景做完很漂亮,一拍视频就露怯,问题出在“镜头感”没有提前进入灰盒阶段。动画短片里的外景街道,真正被观众看到的可能只有镜头扫过的那几个立面,其他朝向就算做得很细,也拍不进去;反过来如果镜头会绕着街角转,那条转角线的刻画就必须充分。
我习惯在灰盒里先放两三个相机:一个低角度广角推进,一个平视慢拉,一个从二层窗户探出的俯视。然后反复模拟画面,把主要视线的尽头安排一个“视觉落点”,比如钟楼、大树、大招牌。建筑立面的细化优先级也随之确定:正对镜头的一面细节最密,次要立面适当减负,背面甚至可以用简化模块。这不是偷懒,而是把时间花在观众真正看得到的地方。
2.3 建筑物不能沿街排队,节奏要靠凹凸和屋顶打破
如果所有建筑沿街道边缘整齐排一条线,不管材质多精致,画面都很“开发区”。卡通街景需要的错落感来自三个层面:平面上建筑有进有退,立面上窗台、雨棚、招牌有高低差,轮廓线上屋顶有尖有平、有高有矮。
我在灰盒里刻意让每栋楼前后错位0.5到1.5米,同时让屋顶形式交替出现:两栋坡屋顶夹一栋平屋顶,转角处放一个带塔楼的二层建筑。街道两旁的大树也不要对称种,种成“一边密一边疏”,这样镜头推进时不至于两侧画面过于均衡而显得刻意。这些节奏变化都是免费的东西,只是在灰盒阶段多拖几个方块的事,但最后成片的效果就是“自然”和“摆拍”的差距。
3. 模块化资产制作:墙体、屋顶和藏在细节里的贴图技巧
3.1 为什么卡通风格更适合“低模 + 手绘贴图”组合
写实PBR风格追求物理正确,金属度、粗糙度、法线贴图缺一不可;但卡通风格本质上是“画出来的感觉”,它更依赖色块、线条和主观颜色。建模阶段只需要搭出干净的基础形状,真正的细节全部交给贴图去表达。
我当时定的是所有建筑件都用低模,平均每栋楼2万到4万三角形,墙面就是简单的大平面加少量凸起结构,门框窗框单独连一个“外壳”。屋顶的瓦片不用一片片建模,直接用贴图画瓦片纹理,再叠加一点顶点色做明暗变化。这样的好处非常明显:一是场景里重复建筑多,低模加共享贴图能快速铺完;二是手绘贴图风格统一,卡通感比高模硬表面更容易出来。
3.2 建筑模块拆解与共享贴图设计
模块化拆件是卡通街道的核心效率手段。我把建筑拆成这几类:标准墙段、带窗墙段、带门墙段、转角墙段、山墙、屋顶板、阳台栏杆、雨棚、门、窗框、招牌底座。每类再按尺寸做两三个变体,组合起来基本能覆盖整条街的需求。
比如墙体模块,我做了三种:4米无窗墙、4米带双窗墙、4米带门带窗墙角组合。它们共享一张2K手绘贴图,通过不同UV区间来表现不同颜色。贴图里我会一次性画好米色打底、砖缝线、墙脚污渍、窗台投影这些通用元素,然后在引擎里通过实例化材质调整颜色,让同一张贴图刷出米黄、浅粉、淡蓝等不同墙面。这招对控制DrawCall尤其有效,后面专门讲。
屋顶也一样:一张包含瓦片方向、明暗过渡、边缘高光的屋顶贴图,配上坡屋顶、平屋顶两种几何,再加不同颜色的材质实例,就能让整条街不重样。
3.3 手绘贴图的实际操作笔记
很多人问卡通贴图怎么画才不像“塑料”。我自己在Substance Painter里手绘卡通贴图时,有一套固定图层顺序,基本不会翻车:
- 固有色层:铺大色块,这一步定色调;
- AO层:用中灰到深棕画阴影,重点是墙角、窗下、屋檐投影;
- 暖色光照层:在朝上、朝外的面加一层淡橙黄,模拟太阳;
- 冷色阴影层:在朝下、内凹的结构加一层淡蓝紫,做出体积;
- 细节笔触层:砖缝、木纹、墙皮脱落、青苔,全部用带手绘感的小笔刷。
这套流程的核心思路是:AO给结构感,冷暖补色给体积感,笔触给卡通味道。最后粗糙度统一拉到0.8左右,让表面呈哑光,避免高光破坏童话感。真实感不靠噪点贴图堆,而靠颜色关系,这点和写实完全相反。
3.4 道具与附加物:街道不是建筑的背景板
一条有生活感的卡通街道,几乎全靠道具撑起来。建筑只是“容器”,路灯、长椅、花坛、井盖、邮筒、摊位、招牌、雨棚、排水管、窗台花架这些东西才是让街道“活”的因素。
我列了一份道具清单,按数量和种类分级:一类是必放且重复多的,比如路灯每15到20米一盏、长椅两三个成组、花坛每个店铺门口一两组;二类是点缀性质的,比如转角处的邮筒、墙上的排水管、地面井盖;三类是“讲故事”的道具,比如某个店铺门口的推车、挂在墙上的面包招牌、晾着的花布。这些道具统一用低模加手绘贴图制作,复用率很高,但每放一个都要考虑它的逻辑:为什么出现在这里,能不能被镜头看到。没有逻辑的道具不如不放。
4. 让卡通镇子“活”起来:光照、雾效与后处理的搭配
4.1 卡通场景的灯光组合思路
卡通场景的光照,不需要物理上的精确,但一定要“温暖、有方向、有形状”。我当时给小镇街道布了一套很简单的三点方案:主方向光是暖橙色的低角度阳光,角度大约30度,色温偏暖;环境天光用莹莹的淡蓝色,把阴影部分拉出冷色;再补一个很弱的前侧光,负责把背光面微微照亮,避免死黑。
这里有个非常关键的技巧:阴影的柔和度。卡通风格的阴影边缘一定要软,硬阴影会让场景显得生硬。实时渲染里我会调大方向光的阴影柔和参数,烘焙时则专门增大阴影采样范围。此外还可以给场景加一个“暗角氛围光”,就是在街角、巷子深处放一些有颜色的局部点光源,比如暖黄色的窗内光、淡绿色的树影光,这些都是氛围感的利器。
4.2 距离感:雾效、远景与深度层次
一条街只有近景和中景撑不起来,远景同样重要。卡通小镇的远景我用三层来搭:第一层是街道尽头的建筑剪影,第二层是低饱和的树冠和屋顶轮廓,第三层是天空背景。中间靠雾把它们融在一起。
我当时用的是指数高度雾,颜色选淡蓝紫,浓度控制在0.02到0.04之间,越远越灰,这样近处的暖色街道和远处的冷雾会形成很舒服的对比。雾还有个隐藏作用:把重复建筑之间的“粘贴感”抹掉。现实中街道尽头的墙面颜色会很跳,但雾一罩,整条街就统一了。如果引擎支持,也可以在雾后加一个简单的渐变天空球,让天空颜色和雾色接上。
4.3 后处理参数参考
同一个场景,开不开后处理完全是两个观感。目标是“像动画电影里的一帧”,而不是“装了滤镜的游戏截图”。我常用的后处理参数给一个相对值范围,不同引擎略有差异,但思路通用:
| 后处理项 | 参数方向 | 建议值/说明 |
|---|---|---|
| 曝光补偿 | 略微压暗 | 让画面不至于发灰,保留高光层次 |
| 泛光 | 微量即可 | 数值太大会把卡通细节全部糊掉 |
| 色差 | 极轻微 | 边缘有一点红蓝分离,模拟镜头感 |
| 暗角 | 中低强度 | 把视线往街道中央收 |
| 色温调整 | 偏暖5%-8% | 整体往阳光色靠,前街更“甜” |
后处理滤镜(LUT)我建议在场景调好后再套,先用LUT统一色调,再微调曝光和饱和度。卡通场景的饱和度不要拉满,保留一点灰度才耐看。
4.4 静态烘焙与实时动态的取舍
对于一条不需要动态时间流逝的街道场景,我强烈建议用烘焙光照把主光和阴影固定下来,然后只保留少量实时光源给灯箱、窗户这类动态内容。烘焙的好处是画面干净,几乎零噪点,而且性能友好,DrawCall压力也小。代价是改灯光位置必须重新烘焙,迭代慢。
我当时是白天外景,主光固定烘焙,店铺门口的灯牌和几个室内光源用实时点光源。如果项目要求支持夜晚和白天切换,那就得全动态,这时需要把阴影级联参数调好、限制实时阴影的物体数量。多数短视频项目其实不需要日夜切换,优先烘焙是更聪明的选择。
5. 从第一版到成品的踩坑记录:比例失衡、漏光和DrawCall
5.1 一版返工:街道像工业区,问题出在比例和密度
第一次全场景预览时我差点崩了,画面里那条街又宽又空,建筑像一排仓库,一点童话氛围都没有。对照项目目标复盘,问题出在两个地方:一是街道宽度我初期留了12米,建筑相对矮,镜头里两边的立面被拉得又扁又散;二是建筑立面太光,大面积墙面上只有窗户,缺层次。
调整方案:把主街压缩到8.5米,同时给沿街建筑增加厚度——窗台突出15厘米、门廊往前伸半米、招牌往外挑30厘米。这些几何上的“小凸起”别看体积小,在透视画面里会形成非常丰富的阴影层次,墙不再是一张皮。另外把所有建筑统一加了一层腰线装饰,把一层和二层视觉分开,体量感立刻出来了。这次返工花了三天,但之后场景的“街感”对了。
5.2 UV接缝漏光与烘焙黑斑:固定排查顺序
烘焙光照之后,我在好几面墙上发现了莫名其妙的亮线和黑斑。排查过程是这样的:先看光照贴图分辨率,把数值从512提高到1024,黑斑减少但仍然有;再看UV接缝,发现墙体模块的UV padding设得太小,箱子附近的采样互相污染,漏光主要来自这里。
处理手法:把建筑模型的光照贴图UV重新展开,接缝尽量藏到窗框、屋檐、墙角这类结构转折处;同时给UV加2到4像素的padding,让相邻区域的颜色不会串到一起去。烘焙前养成习惯,先检查一遍所有模型的UV壳边界,特别是那些相互靠近的小片区域。这个坑几乎每个做场景的人都会踩一遍,提前检查能省一整天的返工。
5.3 DrawCall与内存:卡通场景最常见的性能陷阱
卡通场景资产重复度高,但如果不做合批,重复反而是性能灾难。我的场景最初有500多个独立物体,DrawCall逼近800,一眼看过去全是红。后来做了两轮优化。
第一轮是把同材质、同贴图的建筑模块合并成几个大Mesh,静态物体全部勾上静态合批;第二轮是给重复率高的道具——路灯、花坛、长椅——全部换成实例化绘制,同一个模型实例几千次几乎不增加额外开销。优化后DrawCall降到180左右。如果项目里植被多,还可以用集群实例化和距离裁剪,但要小心卡通风格的树一旦被裁剪掉会显得秃,所以距离裁剪范围宁可大一点,或者用LOD渐进替换,而不是硬切消失。
5.4 空荡感的隐形原因:道具密度和视觉层次
返工前我一度以为空荡是因为模型不够,于是拼命加路灯和花坛,但镜头画面还是空。后来把一个镜头拆成前中后三层分析,发现问题出在“中景没有层次”——远处有建筑,近处有道具,但中间全是空白路面。
解决办法很直接:在街道两侧增加连续的“节奏道具”,比如每隔几米放一组靠墙停放的单车、两个木箱、一个花箱;大型道具如遮阳棚、树冠,把它们的顶部轮廓交错起来,让视线在中景有东西可停留。卡通街道的“满”不是塞满,而是让每个镜头里都有近景、中景、远景三层内容,层与层之间互相遮挡一点,画面立刻厚起来。
6. 交付前做的那几件事:导出规范、性能预算与最终校验
6.1 资产命名与目录结构的统一
项目后期最怕的就是“找不到模型”“不知道这个是哪个版本的”。我养成了一个习惯:从第一天起就按规范命名整个资产目录。路径大致是 Assets/Models/Building/,里面分 Wall、Roof、Window、Door、Prop 等子目录;模型命名统一用 SM_类型_尺寸_变体号,比如 SM_Wall_4m_01;贴图命名统一用 T_类型_用途_通道,比如 T_Building_Wall_BaseColor。
材质实例化的参数也尽量做成一目了然的版本:每个建筑只有一个材质实例,暴露几个参数:BaseColor颜色、墙面脏污强度、窗框颜色。这样如果要调整整条街的色调,只需要改几个材质实例,而不是跑到贴图软件里重画。
6.2 最终校验清单:穿模、裁剪、光影和动态闪烁
交付前需要一套系统性检查,我自己总结了五个步骤:
- 全场景跑一遍,检查碰撞体和穿模,特别是门洞、楼梯、屋檐底下的活动区域;
- 预览所有镜头角度,看有没有裁剪(Culling)导致的模型突然消失;
- 切换不同分辨率宽高比,确认地平线附近没有硬边;
- 烘焙后的阴影边缘有没有异常闪烁,尤其是树枝、招牌这类细碎物体;
- 用性能分析工具看一遍DrawCall、三角形数量和显存占用,对比项目预算。
这些检查我至少跑两轮:第一轮大体扫,第二轮专盯影子与裁剪。很多看起来“差不多能交”的场景,就是在第二轮里暴露出问题的。
6.3 再说一个收尾习惯:截图前多跑一遍
最后分享一个我自己很受用的习惯:每次觉得“可以截图交付”的时候,不要急着出图,先录一段30秒的摄像机路径视频,导出后调低音量去看画面。静止截图看不出很多动态问题,比如远处植被的阴影在移动、某面墙的光照闪烁、雾的浓度变化太突然。这些只有动态预览能暴露出来。把动态预览当作交付前的最后一道防线之后,我踩在“甲方验收时发现阴影抖动”这类坑上的次数基本降为零。做外景场景,尤其是卡通风格的外景,耐心比技术更稀缺,多跑两遍,成品质感会肉眼可见地上一个台阶。