ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Blender着色器实现绘画感纹理:桑原滤镜与NPR风格化材质全解析

2026/10/1 5:55:10 拓冰建站 浏览量
Blender着色器实现绘画感纹理:桑原滤镜与NPR风格化材质全解析 1. 这套材质到底在解决什么问题第一次看到“让任何纹理自带绘画感”这个说法我脑子里蹦出来的不是某个具体节点而是过去几年做 NPR非真实感渲染项目时反复踩过的坑手绘贴图太贵、程序化纹理太“干净”、三渲二总有一股挥之不去的塑料味。尤其是做风格化场景或者角色的时候你拿一张照片或者一张 PBR 材质往模型上一贴渲染出来就是“照片贴在了模型上”跟“画出来的”完全是两回事。这套材质的核心目标很明确把任意输入纹理照片、程序化噪声、手绘贴图、甚至纯色块转换成带有绘画笔触感的输出而且这个过程是在 Blender 着色器编辑器里完成的不依赖外部软件不需要手绘不需要烘焙。它解决的是“有纹理但没画味”这个中间地带的问题——你已经有了一张纹理但它太写实、太均匀、太数字你需要给它注入一种“被人画过”的质感。适合谁来参考三类人最直接受益。第一类是做 NPR 风格化渲染的比如三渲二、水彩风、油画风、铅笔速写风这套东西可以直接挂到材质节点树里当滤镜用。第二类是做概念设计预演的模型刚搭完材质还没画先用这套程序化滤镜跑一版有绘画感的预览比纯灰模或者纯色块强太多。第三类是玩 Blender 着色器编辑器的想理解程序化纹理扰动、坐标变换、滤镜叠加这些底层逻辑这套节点树是一个非常好的拆解样本。我自己的使用场景比较杂有时候是给建筑可视化加一点手绘草图的味道有时候是给游戏道具做风格化材质有时候纯粹是拿照片做实验看看能不能“画”出来。实测下来这套思路的通用性比我最初预期的要强很多关键不在于你输入什么纹理而在于滤镜链怎么搭。2. 核心思路拆解为什么是“滤镜”而不是“重绘”2.1 绘画感的本质是什么很多人一提到“绘画感”第一反应是笔触。笔触确实重要但笔触只是表象。真正让一张图看起来像“画出来的”而不是“拍出来的”核心在于三个东西边缘的不规则性、颜色的局部偏移、以及纹理的方向性扰动。你去看任何一幅手绘作品线条不会是数学意义上的直线颜色不会是一块均匀的色块纹理不会沿着一个完美的方向重复。人的手在画的时候每一笔都有微小的抖动每一次调色都有细微的偏差这些“不完美”叠加起来就形成了绘画感。程序化纹理的问题恰恰在于它太完美了——噪声是均匀的条纹是等距的颜色是精确的。所以这套材质的底层逻辑不是“画一笔上去”而是“把完美的东西弄得不完美”。它不生成新的纹理它是对已有纹理做“破坏性处理”让纹理在保持原有信息的同时获得手绘的不规则性。2.2 为什么选择着色器编辑器而不是其他方案在 Blender 里做绘画感纹理有好几条路可以走。一条是直接在图像软件里手绘质量最高但成本也最高而且不可复用。一条是用几何节点做但几何节点处理的是几何体对纹理像素级别的操作不如着色器节点直接。还有一条是用合成节点做后期但合成节点是屏幕空间的跟材质本身脱钩换一个模型或者换一个视角就失效了。着色器编辑器的优势在于它是材质级别的跟模型绑定跟 UV 绑定跟光照无关。你调好一套节点保存成材质以后任何模型都可以用任何纹理都可以往里塞。而且着色器节点是实时计算的你在视口里就能看到效果不用等渲染。这对于需要反复调整的 NPR 工作流来说效率差距是数量级的。另外一点很关键着色器编辑器里的程序化滤镜是非破坏性的。你原始纹理还在只是经过了一层节点处理。如果效果不满意改几个参数就行不用重新画。这种可逆性在项目迭代中太重要了我吃过太多“画完了发现方向不对全部重来”的亏。2.3 桑原滤镜在其中的角色桑原滤镜Kuwahara Filter是这套方案里最核心的一个组件。它的原理说起来不复杂对每个像素取一个邻域把邻域分成四个象限计算每个象限的均值和方差然后选择方差最小的那个象限的均值作为输出。方差小意味着这个象限里的颜色比较一致也就是“平坦区域”。这样处理的结果是平坦区域被平滑边缘被保留整体呈现出一种类似油画笔触的块状效果。为什么桑原滤镜特别适合做绘画感因为它天然产生色块化的平滑而不是高斯模糊那种糊成一团的效果。高斯模糊会把边缘也模糊掉桑原滤镜只模糊平坦区域边缘反而更清晰。这正好符合绘画的逻辑画家在画一个区域的时候笔触是成块的但不同区域之间的边界是明确的。在 Blender 着色器编辑器里实现桑原滤镜不能像写代码那样直接循环采样。需要用节点组合来近似。常见的做法是用多次采样加权重混合或者用坐标偏移加噪声扰动来模拟象限选择。我试过几种不同的节点实现方式后面会详细拆。2.4 整体节点树的架构逻辑整套材质的节点树可以分成四层输入层、扰动层、滤镜层、输出层。输入层负责接收任意纹理可以是图像纹理节点也可以是程序化纹理节点甚至可以是纯色。这一层的关键是统一坐标空间确保后续的扰动和滤镜在同一个 UV 坐标系下工作。扰动层是绘画感的第一来源。它用噪声纹理对 UV 坐标做偏移让原本规则的纹理产生不规则的扭曲。这一步的强度需要控制太弱了没效果太强了纹理就糊了。我一般用两个不同尺度的噪声叠加一个负责大尺度的形变一个负责小尺度的抖动。滤镜层是核心桑原滤镜就在这里。它接收扰动后的纹理做色块化平滑处理。这一层还可以叠加其他滤镜比如边缘检测、颜色量化、笔触方向模拟等根据需要的绘画风格来定。输出层负责把处理好的纹理接到 Principled BSDF 或者 Emission 上同时可以混合原始纹理控制绘画感的强度。这一层还负责处理光照响应如果是 NPR 渲染可能需要把着色器改成 Diffuse 或者 Emission 模式。3. 核心细节解析与实操要点3.1 坐标系统的统一与变换所有纹理操作的第一步都是坐标。在 Blender 着色器编辑器里默认的纹理坐标是 UV但 UV 是二维的而且受模型展开方式影响。如果你直接用 UV 做扰动不同模型的扰动效果会不一致。我的做法是先用 Texture Coordinate 节点的 Object 输出然后用 Mapping 节点做一次标准化把坐标映射到 0-1 范围再转成 UV 空间。具体操作添加 Texture Coordinate 节点把 Object 输出接到 Mapping 节点的 Vector 输入。Mapping 节点的 Scale 设为 1Location 设为 0Rotation 设为 0。然后加一个 Vector Math 节点用 Multiply 模式把 Mapping 的输出乘以一个控制参数。这个参数决定了纹理的平铺次数我一般设在 2 到 5 之间太低纹理太大太高纹理太碎。注意如果你用的是 Image Texture 节点它本身有 Vector 输入你可以直接把处理后的坐标接进去。但如果你用的是程序化纹理比如 Noise Texture它也有 Vector 输入同样可以接。关键是所有纹理节点共用同一套坐标否则扰动和滤镜会对不上。坐标变换里还有一个坑非均匀缩放。如果你在 Mapping 节点里对 X 和 Y 设置了不同的 Scale纹理会被拉伸扰动也会跟着拉伸出来的笔触方向就不对了。我一般保持 X 和 Y 的 Scale 一致如果需要方向性笔触用单独的旋转或者方向噪声来控制而不是靠缩放。3.2 噪声扰动的参数选择与叠加策略扰动层的核心是噪声纹理。Blender 自带的 Noise Texture 节点有几种类型Perlin、Voronoi、Musgrave新版本改成了 Noise 的几种模式。做绘画感扰动我推荐用 Perlin 或者 Fractal 模式因为它们的连续性比较好不会产生太硬的边界。参数方面Scale 控制噪声的频率Detail 控制细节层次Roughness 控制细节的衰减Distortion 控制扭曲强度。我的经验值是Scale 设在 5 到 15 之间Detail 设在 2 到 4Roughness 设在 0.5 左右Distortion 设在 0.5 到 1.5 之间。这些值不是固定的需要根据纹理的原始尺度来调。叠加策略上我用两层噪声。第一层是大尺度噪声Scale 设小一点比如 3-5用来做整体的形变让纹理的走向产生弯曲。第二层是小尺度噪声Scale 设大一点比如 20-30用来做局部的抖动模拟手绘时笔触的微小偏移。两层噪声通过 MixRGB 节点以 Add 或者 Overlay 模式混合混合系数控制在 0.3 到 0.5 之间。实操心得噪声的 Distortion 参数非常关键。如果你发现扰动后的纹理出现了明显的“漩涡”或者“拉伸”痕迹说明 Distortion 太高了。把它降到 0.5 以下或者换一个噪声类型。我试过用 Voronoi 做扰动出来的效果太硬像碎玻璃不适合绘画感。3.3 桑原滤镜的节点实现方案桑原滤镜在 Blender 着色器编辑器里没有现成节点需要自己搭。我试过三种方案各有优劣。方案一多次采样加权重混合。用多个 Image Texture 节点每个节点用不同的坐标偏移采样同一张纹理然后根据方差计算权重加权平均。这个方案最接近原始桑原算法但节点数量多性能开销大。一般需要 8 到 16 次采样视口刷新会变慢。方案二坐标偏移加噪声选择。用噪声纹理生成一个随机的象限选择值然后用这个值去偏移采样坐标模拟象限选择的效果。这个方案节点少性能好但效果是近似的边缘保持不如方案一。我一般用这个方案做快速预览。方案三混合方案。用 4 次采样对应四个象限每个象限用噪声做微小的坐标抖动然后取方差最小的那个。这个方案在效果和性能之间取得了比较好的平衡我最终采用的是这个。具体节点连接添加四个 Image Texture 节点共用同一张图像但每个节点的 Vector 输入接一个不同的 Vector Math 节点。这四个 Vector Math 节点分别对原始坐标做 XY、-XY、-X-Y、X-Y 的偏移偏移量由一个控制参数决定我一般设在 0.002 到 0.01 之间。然后每个 Image Texture 的输出接一个 RGB to BW 节点转成灰度再接到 Math 节点计算方差。四个方差值通过 Math 节点比较选出最小的那个然后用这个索引去混合四个采样颜色。注意桑原滤镜的半径参数非常敏感。半径太小色块化效果不明显半径太大纹理细节全丢了。我一般从 0.005 开始试根据纹理分辨率调整。如果是 2K 纹理半径可以到 0.01如果是 512 纹理半径要降到 0.002 以下。3.4 颜色量化与笔触方向模拟桑原滤镜出来的是平滑的色块但绘画感还需要颜色的“不连续性”。真实的手绘作品颜色不是连续渐变的而是分成有限的几个色阶。所以需要在桑原滤镜之后加一个颜色量化节点。颜色量化的做法很简单用 Math 节点的 Floor 或者 Round 模式把颜色值映射到有限的几个层级。比如你想要 8 个色阶就把颜色乘以 8取整再除以 8。在 Blender 里可以用 Separate RGB 节点把颜色拆成三个通道分别做量化再用 Combine RGB 合回去。量化层级我一般设在 6 到 12 之间太少颜色断层太明显太多又失去了绘画感。笔触方向模拟是另一个提升绘画感的关键。桑原滤镜产生的是各向同性的色块但真实笔触是有方向的。我的做法是用一个方向噪声比如 Wave Texture 或者 Gradient Texture 加噪声扰动生成一个方向场然后用这个方向场去偏移桑原滤镜的采样坐标。这样色块就会沿着某个方向拉长形成笔触感。方向场的生成添加 Wave Texture 节点Type 设为 BandsDirection 设为 X 或者 YScale 设在 5 到 10 之间。然后加一个 Noise Texture 节点用它的输出去扰动 Wave Texture 的坐标。这样方向场就不是完全平行的而是有自然的弯曲。最后把方向场的输出接到桑原滤镜的坐标偏移上偏移量控制在 0.001 到 0.005 之间。3.5 输出层的混合与光照响应输出层要做两件事一是把处理后的纹理和原始纹理混合控制绘画感的强度二是设置光照响应确保渲染结果符合 NPR 的需求。混合用 MixRGB 节点Fac 控制混合比例。我一般把 Fac 设在 0.6 到 0.8 之间保留一点原始纹理的细节避免绘画感太强导致纹理信息丢失。混合模式用 Mix 或者 OverlayOverlay 会保留更多对比度适合做油画风Mix 更中性适合水彩风。光照响应方面如果是纯 NPR 渲染直接把混合后的颜色接到 Emission 节点这样不受光照影响颜色就是最终输出。如果需要一点光照感接到 Diffuse BSDF但把 Roughness 设到 1.0Specular 设到 0这样只有漫反射没有高光。我一般用 Diffuse 加一点 Emission 的混合Emission 强度设在 0.1 到 0.3 之间给暗部一点自发光避免死黑。实操心得如果你用的是 Eevee 渲染器记得把材质设置里的 Blend Mode 改成 OpaqueShadow Mode 改成 None否则桑原滤镜的色块边缘会出现奇怪的阴影。Cycles 渲染器没有这个问题但渲染速度会慢一些。4. 完整实操流程与参数配置4.1 从零搭建节点树的步骤打开 Blender新建一个材质进入着色器编辑器。我习惯从 Principled BSDF 开始但最终会把它替换掉所以先留着也行。第一步添加 Texture Coordinate 节点和 Mapping 节点。Texture Coordinate 的 Object 输出接 Mapping 的 Vector 输入。Mapping 的 Scale 设为 1,1,1Rotation 设为 0,0,0Location 设为 0,0,0。然后加一个 Vector Math 节点模式设为 Multiply把 Mapping 的输出接进去第二个输入设为一个 Value 节点值设为 3。这个 Value 就是纹理平铺次数。第二步添加两个 Noise Texture 节点。第一个 Noise 的 Scale 设为 4Detail 设为 3Roughness 设为 0.5Distortion 设为 0.8。第二个 Noise 的 Scale 设为 25Detail 设为 2Roughness 设为 0.6Distortion 设为 0.3。两个 Noise 的 Vector 输入都接第一步的 Vector Math 输出。第三步添加一个 MixRGB 节点模式设为 AddFac 设为 0.4。把两个 Noise 的 Fac 输出接进去。然后加一个 Vector Math 节点模式设为 Add把 MixRGB 的输出和一个 Value 节点值设为 0接进去。这个 Vector Math 的输出就是扰动后的坐标。第四步添加四个 Image Texture 节点都加载同一张纹理。每个 Image Texture 的 Vector 输入接一个 Vector Math 节点模式设为 Add。这四个 Vector Math 节点的第一个输入都接第三步的扰动坐标第二个输入分别接四个 Value 节点值分别为 (0.005, 0.005, 0)、( -0.005, 0.005, 0)、( -0.005, -0.005, 0)、(0.005, -0.005, 0)。这就是四个象限的采样偏移。第五步每个 Image Texture 的输出接一个 RGB to BW 节点再接一个 Math 节点模式设为 Multiply第二个输入接同一个 RGB to BW 的输出。这样得到的是每个象限的方差近似值。四个 Math 节点的输出接一个 Math 节点模式设为 Minimum找出最小值。然后用这个最小值去驱动一个 MixRGB 节点把四个 Image Texture 的颜色混合起来。第六步添加颜色量化。用 Separate RGB 节点把混合后的颜色拆开每个通道接一个 Math 节点模式设为 Multiply第二个输入设为 8。然后接一个 Math 节点模式设为 Floor。再接一个 Math 节点模式设为 Divide第二个输入设为 8。最后用 Combine RGB 合回去。第七步添加方向场。用 Wave Texture 节点Type 设为 BandsDirection 设为 XScale 设为 8。加一个 Noise Texture 节点Scale 设为 10用它的输出接 Wave Texture 的 Vector 输入。Wave Texture 的输出接一个 Vector Math 节点模式设为 Multiply第二个输入设为 0.003。这个输出加到桑原滤镜的采样坐标上。第八步混合原始纹理。用 MixRGB 节点Fac 设为 0.7把量化后的颜色和原始纹理颜色混合。输出接到 Diffuse BSDF 的 Color 输入Roughness 设为 1.0Specular 设为 0。4.2 关键参数的调试与优化节点树搭好之后需要反复调试参数。我一般按这个顺序来先调噪声扰动的强度。把 MixRGB 的 Fac 从 0 慢慢加到 0.5观察纹理的形变。如果纹理开始出现明显的扭曲但不至于糊掉就停在这个值。我一般停在 0.3 到 0.4 之间。再调桑原滤镜的半径。把四个 Value 节点的值从 0.001 慢慢加到 0.01观察色块化的程度。如果色块开始明显但边缘还保持清晰就停在这个值。2K 纹理一般停在 0.005 到 0.008 之间。然后调颜色量化的层级。把 Multiply 节点的第二个输入从 4 慢慢加到 16观察颜色的断层。如果颜色分成明显的几块但不至于太生硬就停在这个值。我一般用 8 或者 10。最后调混合比例。把 MixRGB 的 Fac 从 0.5 慢慢加到 0.9观察绘画感和纹理细节的平衡。如果绘画感明显但还能看出原始纹理的走向就停在这个值。我一般用 0.7 到 0.8。注意每次调完一个参数最好把其他参数复位到默认值单独观察这个参数的影响。同时调多个参数很容易迷失方向不知道是哪个参数在起作用。4.3 不同纹理类型的适配策略这套材质对输入纹理的类型有很强的适应性但不同类型的纹理需要不同的参数侧重。照片类纹理比如砖墙、木纹、石材本身细节丰富噪声扰动可以强一点桑原半径可以大一点颜色量化层级可以少一点。因为照片本身的颜色过渡就很丰富量化到 6 到 8 个层级就能出效果。程序化纹理比如 Noise、Voronoi、Wave本身比较干净噪声扰动要弱一点桑原半径要小一点颜色量化层级可以多一点。因为程序化纹理的细节本来就少扰动太强会直接糊掉。手绘贴图本身已经有绘画感了这套材质主要是做风格统一。噪声扰动要很弱桑原半径要很小颜色量化层级可以保持原样或者稍微减一点。重点是让不同手绘贴图的笔触风格趋于一致。纯色块比如平涂的色块这套材质可以给它注入纹理感。噪声扰动要强一点桑原半径要大一点颜色量化层级可以少一点。但纯色块本身没有细节出来的效果会比较抽象适合做背景或者氛围图。4.4 性能优化与渲染设置这套节点树的性能开销主要来自桑原滤镜的多次采样。四个 Image Texture 节点意味着四次纹理采样加上噪声纹理的采样总共大概六到八次采样。在 Eevee 里视口刷新可能会降到 30fps 以下但渲染速度还可以。在 Cycles 里采样次数会直接影响渲染时间但 Cycles 的降噪功能可以弥补。优化方案有几个。一是降低纹理分辨率如果最终输出不需要 4K用 1K 或者 2K 纹理就够了。二是减少桑原采样次数从四次降到两次效果会打折扣但性能提升明显。三是把噪声纹理的 Detail 降到 2 以下减少计算量。四是把整个节点树烘焙成一张新纹理这样运行时就没有计算开销了但失去了实时调整的能力。渲染设置方面Eevee 要把 Ambient Occlusion 打开强度设在 0.5 左右给色块一点立体感。Bloom 可以关掉因为绘画感不需要发光。Cycles 的采样数设在 128 到 256 之间就够了因为这套材质本身就有平滑效果噪点不明显。5. 常见问题与排查技巧实录5.1 纹理出现明显接缝或重复这是最常见的问题。原因通常是坐标没有统一或者噪声扰动的尺度跟纹理平铺次数不匹配。排查步骤先检查 Texture Coordinate 节点是不是用的 Object 输出如果是 UV 输出接缝会跟着 UV 走。然后检查 Mapping 节点的 Scale 是不是 1,1,1如果不是纹理会被拉伸。最后检查噪声的 Scale 跟纹理平铺次数的比值如果噪声 Scale 太小而平铺次数太高扰动会在每个平铺单元里重复形成明显的周期性接缝。解决方法把噪声的 Scale 提高到平铺次数的 2 到 3 倍或者用 Object 坐标代替 UV 坐标让扰动在三维空间里连续。5.2 桑原滤镜效果不明显如果调了半径参数但色块化效果很弱可能是采样偏移的方向不对或者方差计算有问题。排查步骤先确认四个采样偏移是不是分别对应四个象限如果偏移方向搞错了四个采样会重叠方差计算就失效了。然后检查 RGB to BW 节点是不是接在了 Image Texture 的输出上如果接在了 Alpha 或者别的通道上方差计算会出错。最后检查 Math 节点的 Minimum 模式是不是正确连接了四个方差值。解决方法把采样偏移的 Value 节点值调大一点从 0.005 加到 0.01观察效果变化。如果还是不明显把颜色量化层级降到 4 以下强制色块化。5.3 颜色量化后出现色带颜色量化层级太少会导致色带这是正常的但色带太明显就不好看了。排查步骤检查量化层级是不是低于 6如果低于 6色带会非常明显。检查量化后的颜色是不是直接输出如果中间没有混合原始纹理色带会更突出。解决方法把量化层级提高到 8 到 12 之间或者在量化之后加一个非常轻微的噪声扰动打散色带的边界。我一般加一个 Scale 为 50 的 Noise Texture用它的输出乘以 0.02加到量化后的颜色上。5.4 视口刷新太慢节点树太复杂会导致视口刷新变慢尤其是 Eevee 渲染器。排查步骤先看 Image Texture 节点的数量如果超过四个性能开销会明显增加。再看噪声纹理的 Detail 参数如果超过 4计算量会翻倍。最后看是不是开了实时阴影或者环境光遮蔽这些都会增加开销。解决方法把 Image Texture 节点减到两个用两次采样代替四次。把噪声 Detail 降到 2。关掉实时阴影环境光遮蔽降到 0.3。如果还是慢把整个材质烘焙成纹理用烘焙后的纹理代替节点树。5.5 渲染结果跟视口不一致Eevee 视口和 Cycles 渲染的结果经常不一致尤其是颜色和对比度。排查步骤检查 Color Management 设置视口和渲染的 View Transform 是不是一致。检查材质的 Blend Mode 和 Shadow ModeEevee 的这些设置会影响最终输出。检查光照设置Cycles 的光照计算比 Eevee 更准确颜色会更暗或者更亮。解决方法把 Color Management 的 View Transform 统一设为 Standard 或者 Filmic视口和渲染用同一个。Eevee 的 Blend Mode 设为 OpaqueShadow Mode 设为 None。如果颜色差异太大在输出层加一个 Color Balance 节点微调一下亮度和对比度。5.6 常见问题速查表问题现象可能原因排查方法解决方法纹理接缝明显坐标不统一或噪声尺度不匹配检查 Texture Coordinate 和 Mapping 节点用 Object 坐标提高噪声 Scale桑原效果弱采样偏移太小或方差计算错误检查四个采样偏移和 Math 节点连接增大偏移值检查 RGB to BW 连接色带严重量化层级太低检查 Multiply 节点的第二个输入提高到 8-12加轻微噪声扰动视口卡顿节点太多或噪声 Detail 太高检查 Image Texture 数量和噪声参数减少采样次数降低 Detail渲染不一致Color Management 或材质设置不同检查 View Transform 和 Blend Mode统一 View Transform设 Opaque笔触方向混乱方向场噪声太强检查 Wave Texture 的 Vector 输入降低噪声强度提高 Wave Scale颜色太灰混合比例太高或光照太暗检查 MixRGB 的 Fac 和光照强度降低 Fac增加 Emission 强度最后再分享一个小技巧如果你想让绘画感更“脏”一点可以在桑原滤镜之后加一个非常轻微的 Voronoi 纹理用它的 Distance 输出乘以 0.05加到颜色上。这样色块之间会有一些微小的颜色偏移更像手绘时颜料的不均匀。但强度一定要控制好超过 0.1 就会显得很脏像发霉一样。这套材质我前后调了大概两周中间推翻重来了三次。最开始想用纯程序化生成纹理后来发现还是得基于已有纹理做滤镜因为程序化生成的纹理太“空”了没有信息量。后来又在桑原滤镜的实现上卡了很久四次采样的方案试了七八种连接方式才跑通。现在这套节点树已经成了我 NPR 工作流里的标配任何风格化项目都会先挂上它跑一版看看效果。如果你也在做类似的东西建议先从简单的纹理开始试比如一张纯色噪声图把每个节点的作用都摸清楚了再上复杂的照片纹理。这样出了问题你知道是哪一层的问题不会一头雾水。