Unity Shader FLOWMAP岩浆流动制作案例

FlowMap:流动效果实现 flowmap的实质是张记录了2D向量信息的纹理,Flow map上的颜色( 通常为RG通道)记录该处向量场的方向,让模型上某一点表现出定量流动的特征。通过在shader中偏移uv再对纹理进行采样,来模拟流动效果。Flowmap的特征是周期性变化。 阅读详情

使用 Flowmap 技术在 Unity URP 中实现真实感岩浆流动效果, 深入解析 UV 扰动、相位混合与颜色映射原理。

什么是 Flowmap?

Flowmap(流动贴图) 是一张 RGB 纹理,其中 R 通道 与 G 通道 分别存储了 UV 空间中水平和垂直方向上的流动速度向量。通过在每帧对 UV 坐标施加累积的偏移,再叠加循环相位抖动,可以在视觉上模拟出连续、自然的液体流动——而无需任何物理模拟。

对于岩浆效果,这一技术尤为有效:岩浆粘稠缓慢,不同区域流速各异,正好契合 Flowmap 能精细控制局部方向的优势。

🔑 核心思路

将 Flowmap 中采样到的向量乘以时间偏移 UV,得到两个相位差 0.5 的扭曲 UV,分别采样岩浆纹理后做 线性插值(Lerp),消除因 UV 拉伸产生的周期性接缝,最终叠加自发光和颜色梯度。

两个相位在 [0, 1] 之间循环,彼此相差 0.5,当其中一个相位接近 0 或 1(UV 拉伸最严重处)时,另一个恰好在 0.5(最平滑处),权重此消彼长,从而实现无缝过渡。

纹理资源准备

岩浆噪声纹理(Lava Noise Texture)

使用 Substance Designer 或 Photoshop 制作一张包含高频岩浆纹路的噪声贴图,建议分辨率 512×512 或 1024×1024,格式 R8 或 RGB8,开启 Repeat 平铺。颜色范围集中在橙红灰区间,不需要颜色信息——颜色将由 Shader 内部的渐变色阶(Gradient)动态注入。

📐 Substance Designer 节点推荐

在 Substance Designer 中,推荐节点路径:Perlin Noise → Warp(用 FBM 扭曲)→ Levels(拉高对比度)→ Blur HQ(轻微模糊消除锯齿)→ 导出为 Grayscale PNG。 最终目标是高亮区域(值接近 1)形成连续的细窄裂纹,暗区(值接近 0)为大块岩石体。

Flowmap 纹理绘制

Flowmap 本质是一张方向场。可用 Flowmap Painter(免费工具)在模型 UV 上手绘流向。编码规则:
R = (dirX + 1) / 2 G = (dirY + 1) / 2 B = 遮罩 / 强度
静止区域填充 (0.5, 0.5)(即向量 (0, 0)),导出前关闭 sRGB 勾选(Linear 空间)。

💡Unity 导入 Flowmap 时,务必在 Texture Import Settings 中将 sRGB (Color Texture) 取消勾选,否则颜色空间转换会使方向向量发生偏差,导致流向错误。同时将 Compression 设为 None 或至少避免使用 BC1/DXT1,防止低精度压缩破坏方向信息。

颜色渐变贴图(Gradient Ramp)

制作一条从 深黑/暗棕 → 深红 → 亮橙 → 亮黄 的 256×1 渐变条,存为 PNG,关闭压缩,Filter Mode 设为 Bilinear,Wrap Mode 设为 Clamp。

完整 Shader 实现

以下为基于 Unity URP 的 HLSL Shader,使用 ShaderGraph 可以照相同逻辑搭建节点图。核心分为三部分:属性声明、顶点程序、片元程序。

// Unity URP Flowmap Lava Shader
// 适配 URP 14.x | Unity 2022 LTS+

Shader "Custom/LavaFlowmap"
{
    Properties
    {
        // 岩浆噪声纹理
        _LavaTex     ("Lava Noise Texture", 2D) = "white" {}
        // Flowmap(Linear 空间)
        _FlowMap     ("Flow Map", 2D) = "bump" {}
        // 颜色渐变贴图
        _RampTex     ("Color Ramp", 2D) = "white" {}
        _FlowSpeed   ("Flow Speed", Range(0, 2)) = 0.3
        _FlowStrength("Flow Strength", Range(0, 1)) = 0.25
        _EmissivePow ("Emissive Power", Range(1, 5)) = 2.0
        _Tiling      ("Lava Tiling", Vector) = (2, 2, 0, 0)
    }

    SubShader
    {
        Tags { "RenderPipeline"="UniversalPipeline"
               "RenderType"="Opaque" }

        Pass
        {
            Name "ForwardLit"
            Tags { "LightMode" = "UniversalForward" }

            HLSLPROGRAM
            #pragma vertex   vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            // ── 纹理 & 采样器声明 ──────────────────────
            TEXTURE2D(_LavaTex);  SAMPLER(sampler_LavaTex);
            TEXTURE2D(_FlowMap);  SAMPLER(sampler_FlowMap);
            TEXTURE2D(_RampTex);  SAMPLER(sampler_RampTex);

            CBUFFER_START(UnityPerMaterial)
                float4 _LavaTex_ST;
                float  _FlowSpeed;
                float  _FlowStrength;
                float  _EmissivePow;
                float4 _Tiling;
            CBUFFER_END

            struct Attributes {
                float4 positionOS : POSITION;
                float2 uv         : TEXCOORD0;
            };

            struct Varyings {
                float4 positionCS : SV_POSITION;
                float2 uv         : TEXCOORD0;
            };

            // ── 顶点着色器 ────────────────────────────
            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);
                OUT.uv = IN.uv;
                return OUT;
            }

            // ── 片元着色器 ────────────────────────────
            half4 frag(Varyings IN) : SV_Target
            {
                float2 uv = IN.uv;

                // 1. 采样 Flowmap,解码方向向量 [-1, 1]
                float2 flowVec = SAMPLE_TEXTURE2D(_FlowMap,
                                   sampler_FlowMap, uv).rg;
                flowVec = flowVec * 2.0 - 1.0;  // unpack

                // 2. 计算两个相位(相差 0.5)
                float t = frac(_Time.y * _FlowSpeed);
                float phaseA = t;
                float phaseB = frac(t + 0.5);

                // 3. 偏移 UV(叠加平铺)
                float2 tiledUV = uv * _Tiling.xy;
                float2 uvA = tiledUV - flowVec * phaseA * _FlowStrength;
                float2 uvB = tiledUV - flowVec * phaseB * _FlowStrength;

                // 4. 分别采样岩浆纹理
                half sampleA = SAMPLE_TEXTURE2D(_LavaTex,
                                  sampler_LavaTex, uvA).r;
                half sampleB = SAMPLE_TEXTURE2D(_LavaTex,
                                  sampler_LavaTex, uvB).r;

                // 5. 基于相位计算混合权重(消除接缝)
                half weight = abs(sin(phaseA * PI));
                half noise   = lerp(sampleA, sampleB, weight);

                // 6. 通过渐变贴图映射颜色
                half4 color = SAMPLE_TEXTURE2D(_RampTex,
                                 sampler_RampTex,
                                 float2(noise, 0.5));

                // 7. 叠加自发光(亮区幂次增强)
                half3 emissive = color.rgb * pow(noise, _EmissivePow);
                color.rgb += emissive;

                return color;
            }
            ENDHLSL
        }
    }
}

关键参数详解

参数名类型说明推荐值
_FlowSpeedfloat控制岩浆整体流动速度,值越大流动越快0.2 ~ 0.5
_FlowStrengthfloatFlowmap 向量对 UV 的扰动幅度,过大会导致明显拉伸0.1 ~ 0.35
_EmissivePowfloat自发光的幂次曲线,控制亮纹裂隙的对比度与发光强度1.5 ~ 3.0
_TilingVector2岩浆噪声纹理的平铺次数,独立于 Flowmap 平铺2 ~ 4(视模型大小)
_FlowMapTexture2D方向流动贴图,必须以 Linear 导入(关闭 sRGB)—
_RampTexTexture2D颜色渐变条,Wrap Mode = Clamp,Filter = Bilinear黑→红→橙→黄

ShaderGraph 节点对照

如果你更习惯可视化连线,以下是 ShaderGraph 中对应的节点组合,逻辑与 HLSL 完全等价:

进阶优化技巧

A

噪声扰动叠加(Detail Noise)

在主流动 UV 基础上,再叠加一层高频噪声偏移,为岩浆表面增加小尺度涌动细节。可用一张独立的 Voronoi 或 Perlin 噪声纹理,以较快速度平移,再以 0.05 ~ 0.1 的强度叠加到主 UV 上。

B

边缘暗化 / 冷却效果

利用 Flowmap B 通道(或单独遮罩贴图)标记冷却区域,在颜色渐变采样前将 noise 值乘以遮罩,使边缘区域采样到渐变的暗端(暗红/黑色),模拟岩浆冷却固化的岩石边缘。

C

顶点动画(Vertex Displacement)

在顶点着色器中,使用相同的 noise 值(需传入 VS 或通过 Vertex Texture Fetch)驱动法线方向的顶点位移,让岩浆表面产生轻微隆起的涌动感,增强三维真实感。位移量控制在 0.01 ~ 0.05 世界单位以内。

D

屏幕空间光照 & 热浪扰动

结合 URP 的 Distortion Pass 或 Grab Pass(兼容性较差),对岩浆上方的空气进行热浪折射扭曲。将岩浆亮度值映射为折射强度,亮缝隙产生更强的折射,暗区几乎不扰动。

// 在 frag() 中,计算 uvA/uvB 之前追加:

// 高频细节噪声平移
float2 detailOffset = float2(
    frac(_Time.y * 0.07),
    frac(_Time.y * 0.05)
);
half detail = SAMPLE_TEXTURE2D(_DetailNoise,
               sampler_DetailNoise,
               uv * 6.0 + detailOffset).r;

// 将细节偏移叠加到 flowVec
flowVec += (detail - 0.5) * 0.06;

⚡性能提示:Flowmap 本身只需要一次额外的纹理采样,主要开销来自岩浆纹理的双重采样。在移动端,可将 _FlowStrength 降低并减少纹理分辨率,或用单次采样 + 噪声扰动代替完整双相位方案。

实时效果预览

图形学基础——Flowmap的实现 Flow map 百人计划学习地址:图形 2.8 Flowmap的实现 一、基础概念 首先复习一下UV映射 UV坐标用于查找纹理的颜色值 什么是FlowMap? Flowmap的实质就是一张记录了2D向量信息的纹理 Flow map上的颜色(通常为RG通道)记录该处向量场的方向,让模型上某一点表现出定量流动的特征。通过在shader中偏移uv再对纹理进行采样,来模拟流动效果。 Flow Map实现流程 通过所带有的向量场的信息对UV进行偏移,并干扰采样的过程,下图时原本的采样效果变得扭曲 为什么要使用 阅读详情

相关推荐

Unity Shader FLOWMAP实现岩浆流动效果技术解析

FLOWMAP是一种基于矢量场的动态纹理技术,通过RG通道存储流动方向信息驱动UV偏移,在游戏开发中广泛用于模拟流体运动。其核心原理是将二维向量场映射到纹理空间,结合时间变量实现动态扭曲效果,相比传统UV动画具有更好的方向可控性和性能表现。在URP渲染管线中,FLOWMAP技术能高效实现岩浆、河流等自然流体的动态效果,特别适合需要复杂流动轨迹的场景。通过ShaderGraph节点或HLSL代码,开发者可以灵活控制流动速度、强度及噪声扰动等参数,配合多重纹理混合技术,还能实现高温辉光、边缘堆积等次世代特效。

weixin_29009339的博客 287

Unity shader之Flowmap贴图的原理

知乎 简单了解flowmap的使用-https://zhuanlan.zhihu.com/p/33288033

mozhi 8024

Unity中使用Flowmap技术实现逼真岩浆流动效果

Flowmap技术是一种通过向量纹理控制流体动态效果的高级渲染方法,其核心原理是利用RGB通道存储流动方向与强度信息,通过Shader计算实现UV偏移动画。相比传统UV动画,该技术能精确控制区域流动参数,支持复杂路径模拟,在游戏开发中广泛应用于岩浆、魔法流体等场景。从工程实践角度看,Flowmap只需一次纹理采样即可实现高质量流动效果,配合多层叠加和动态噪波等技巧可大幅提升视觉真实感。本文以Unity URP管线为例,详细解析如何通过Shader Graph实现性能优化的岩浆流动方案,包括移动端适配策略和常

weixin_27943395的博客 274

Unity Shader入门精要学习笔记——15章 15.2 水波效果(二 拓展) flowmap实现

目录flowmapflowmap制作无缝循环流动完整片元代码效果 flowmap 实际上是一张表达向量场的纹理,每个纹素用r,g存储了一个2D向量。 flowmap制作 Flowmap Painter 无缝循环流动 用相位差半个周期的两层采样,进行加权混合。使一个周期结束时,另一个已经覆盖了。 采样phase0的函数图像: float phase0 = frac(_Time.y + 0.5) ; x = _Time.y       

m0_37686228的博客 649

Unity Shader Flow Map技术:实现岩浆流动效果全解析

在实时渲染领域,纹理动画是提升场景动态细节的关键技术。其核心原理是通过修改纹理坐标,驱动表面图案随时间变化,从而模拟水流、火焰、能量场等动态视觉效果。Flow Map(流向图)技术在此基础上更进一步,它通过一张编码了方向矢量的纹理,为每个像素点赋予独立的运动方向,从而创造出复杂、自然且性能可控的矢量场流动效果。这项技术在游戏开发、影视特效和模拟仿真中具有极高的应用价值,尤其适用于需要表现非均匀、有方向性流动的场景,如河流、熔岩、魔法轨迹和云层运动。本文将以实现逼真的岩浆流动效果为具体案例,深入剖析Flow

weixin_33860528的博客 353

Unity中手绘FlowMap:FlowPainter编辑器工具实现与Shader采样优化

在实时渲染中,FlowMap是一种记录流动方向的纹理,通过RG通道编码方向向量驱动UV动画。其原理是将方向从[-1,1]重映射到[0,1]存储,Shader采样时再还原。技术价值在于提升水面、岩浆等动态特效的真实感。常见应用场景包括游戏特效、角色流光和能量护盾。然而,传统外部工具绘制FlowMap迭代缓慢,影响开发效率。为此,本文介绍在Unity编辑器内直接绘制FlowMap的FlowPainter工具,涵盖方向编码、Shader双采样混合、笔刷系统与实时预览等关键技术,实现高效迭代。

weixin_34396103的博客 380

unity3d 纹理贴图移动特效产生岩浆、瀑布效果

shader处理纹理贴图移动特效产生岩浆、瀑布效果

wolf96的专栏 1万+

Unity编辑器扩展:FlowMap实时绘制插件FlowPainter实现

在游戏开发中,FlowMap常用于水面、岩浆等流动效果,但传统工具如Houdini和Substance Designer与Unity割裂,导致迭代效率低。FlowPainter插件基于Unity编辑器扩展,通过EditorWindow、射线检测和RenderTexture技术,实现直接在Scene视图绘制FlowMap,并保存为PNG。其核心原理是利用GPU加速的RenderTexture进行笔刷绘制,避免CPU逐像素操作,同时采用切线空间存储流向,确保模型旋转时流向正确。该技术价值在于提升美术迭代速度,适

weixin_34218890的博客 399

FlowMap与TriplanarMapping小记

FlowMap: FlowMap的原理是uv偏移采样,但是这种方式可以实现模拟水体、岩浆流动的效果 要实现效果首先需要flowmap,推荐使用如下工具FlowMapPainter http://teckartist.com/?page_id=107 我们在工具中向不同的方向随便画一画可以得到如下的flowmap,为什么是长这样的呢,因为我们进行偏移时只使用了flowmap的R和G通道,所以...

学无止境 5162

Unity Shader纹理动画:Tilling与Offset原理与实战应用

在实时渲染与游戏开发中,纹理动画是实现动态视觉效果的核心技术之一。其基本原理是通过在Shader中动态修改纹理坐标(UV),驱动纹理采样位置的变化,从而在GPU层面高效生成动画。这项技术的核心价值在于能以极低的性能开销,实现诸如水面流动、火焰燃烧、能量护盾等丰富的动态效果,是优化项目性能、减少对CPU端粒子系统依赖的关键手段。在Unity引擎中,纹理坐标的变换主要依赖Tilling(平铺)和Offset(偏移)两个基础属性:Tilling通过对UV进行乘法缩放控制纹理密度与重复,Offset则通过加法平移实

优快云头条 459

shader 岩浆流动效果.zip

在unity中运行后,可看到岩浆流动的效果,里面有代码和图片资源。这是shader的代码,可供广大shader爱好者学习使用。

【TA-霜狼_may-《百人计划》】图形2.8 Flowmap的实现

图形2.8 Flowmap的实现

卓仔的博客 701

Unity火山岩浆场景

Unity的火山岩浆资源,多个场景,场景内均为复古式建筑

Unity中手绘FlowMap:从原理到FlowPainter工具实现

在游戏开发与实时渲染中,纹理流动效果是水体、岩浆、能量护盾等场景的常见需求。其核心原理是通过一张记录逐像素方向与速度的FlowMap来扰动UV坐标,从而驱动静态贴图产生有组织的流动感。然而,方向场的生成往往面临连续性差、工具链繁琐等痛点。FlowPainter这类编辑器工具将数据生成与实时预览整合在Unity环境内,通过笔刷系统、切线空间映射与双层混合采样,显著提升了迭代效率。该技术广泛应用于水体模拟、技能指示器、角色流光等场景,为Shader特效提供了灵活且高效的控制手段。

weixin_29011993的博客 301

Unity3D火山岩浆,河流流动效果

Win7系统,Unity3D3.5.6f4。 这是Unity3D官方flow资源包免费版本,下载下来跟大家分享,因为是免费版本,只有两个场景,而且还是DLL封装过的,对于学习还是够用了;至于运行是屏幕左下脚出现的那一行字,需要隐藏的话,大家自己把字体颜色调成黑色就可以了,更多功能请去官方下载收费版本。

Unity实时控制佳能单反拍照全流程(附EDSDK 3.6.1配置避坑指南)

本文详细介绍了在Unity中实时控制佳能单反相机进行拍照的完整流程,重点提供了EDSDK 3.6.1的配置与避坑指南。内容涵盖从SDK获取、环境搭建、相机初始化、参数设置到实现拍照控制,并深入探讨了实时取景的延迟优化方案与资源管理,旨在帮助开发者高效集成专业相机,提升AR/VR及摄影测量等应用的视觉输入质量。

go5gopher的博客 184

Flowmap原理与实战:UV空间矢量流动的Shader编码技术

Flowmap是一种在实时渲染中实现可控纹理流动效果的基础技术,其本质是将二维位移向量场(dx, dy)线性编码至RGB贴图通道,通过Shader单次采样即可完成方向与速度驱动的UV偏移。它不依赖时间函数硬推,避免了传统sin/cos驱动导致的方向单一、速度均一和采样失真等问题;相比顶点动画与粒子系统,具备低内存、跨分辨率、高可控性等工程优势。作为技术美术和Shader程序员进阶材质表现的关键工具,Flowmap广泛应用于水面反射、熔岩流动、布料滑动等需‘物理感’而非‘物理仿真’的场景,尤其适合Unity、

weixin_32147929的博客 218

【计算机三级-数据库技术】操作题大题(第1套)

从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。使用FOR或AFTER选顶定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。转换成新的独立的模式,模式的属性由联系本身的属性及两个实体的键构成,主键由两端实体的键组合而成。实体的转换:在从ER图转换为关系模式时,一个实体转换成一个关系模式,实体的属性就是关系模式的属性,实体的键就是关系的主键。

放纵小开爱的博客 1101

Shader Graph 水面流动效果:Flow Map 原理与 UV 偏移避坑指南

在实时渲染中,UV 动画是实现纹理流动的基础技术,通过随时间偏移纹理坐标来模拟运动。其原理是将方向、速度与时间相乘后叠加到 UV 上,并利用小数部分循环以避免精度问题。这项技术能显著提升水面、岩浆等材质的真实感,广泛应用于游戏河流、溪流及特效场景。然而,普通 UV 偏移只能实现全局均匀流动,无法表现逐像素变化的复杂流向。Flow Map 通过 RG 通道存储方向、B 通道存储速度,解决了拐弯、分流等难题。但在 Shader Graph 中集成时,需注意 Fraction 位置、方向解码和速度范围等常见陷阱,

weixin_34296641的博客 394

【嘉立创EDA】从AD21导入pcb边界到嘉立创EDA专业版

有许多前期工程由AD进行完成,在后续update的过程中,由于开模等原因限制,部分pcb外型需要继续沿用,本文将此过程记录,以供有需要的读者参考。

l64481000的博客 4520

C#构建高精度预测模型:从数据预处理到模型部署的实战指南

【代码】C#构建高精度预测模型:从数据预处理到模型部署的实战指南。

墨夶的博客 1263

Unity Flowmap原理与实战:向量场驱动的UV扰动技术

Flowmap是一种用于实时图形渲染的二维向量场纹理技术,其核心是将方向与位移信息编码于RG通道,实现对UV坐标的动态扰动。它不同于传统动画贴图或法线贴图,本质属于数据纹理,遵循[-1,1]归一化向量空间,在GPU端以极低开销完成像素级运动模拟。该技术显著降低CPU-GPU同步压力,避免Draw Call增加,广泛应用于水流、熔岩、布料、次表面散射等视觉效果。结合Shader编程与美术工作流(如16-bit制作、sRGB校准、Repeat采样),Flowmap成为移动端、VR及URP/HDRP管线中平衡性能

weixin_29015801的博客 86

SpringBoot + MyBatis-Plus 高效实现数据变更记录:从注解到通用审计方案(附源码)

*** 数据变更审计插件* 拦截增删改操作,自动记录变更日志*/@Component@Resource/*** 拦截SQL执行*/@Override/*** 数据变更审计插件* 拦截增删改操作,自动记录变更日志/*** 拦截SQL执行。

2601_94871597的博客 559
上一篇: Unity Shader 用 Ramp 贴图实现薄膜干涉效果
下一篇: Unity Shader UI 流光效果完全推导指南
mxwin
博客等级 码龄19年 22粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值