ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

3D卡通风格小镇街道制作全流程:从灰盒到灯光后处理与踩坑实录

3D卡通风格小镇街道制作全流程:从灰盒到灯光后处理与踩坑实录 接到一个“外景 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.75m1.2m2.2m5-6m像个玩具城三头身Q版1.05m1.8m3.0m8-9m童话里有生活感的街区写实比例卡通1.7m2.2m3.5m10-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. 从第一版到成品的踩坑记录比例失衡、漏光和DrawCall5.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秒的摄像机路径视频导出后调低音量去看画面。静止截图看不出很多动态问题比如远处植被的阴影在移动、某面墙的光照闪烁、雾的浓度变化太突然。这些只有动态预览能暴露出来。把动态预览当作交付前的最后一道防线之后我踩在“甲方验收时发现阴影抖动”这类坑上的次数基本降为零。做外景场景尤其是卡通风格的外景耐心比技术更稀缺多跑两遍成品质感会肉眼可见地上一个台阶。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进