参考
may佬《技术美术百人计划》

Flowmap的实现

Flowmap的定义

flowmap实质上是一张记录了2D向量信息的纹理,使用颜色(通常为RG通道)记录该处向量场的方向,让模型上某一点表现出定量流动的特征,通过在shader中偏移UV再对纹理进行采样来模拟流动效果

前置了解:UV映射

  • UV坐标用于查找纹理的颜色值,使用(R,G)颜色通道表示坐标,黑色(0,0),绿色(0,1),红色(1,0),黄色(1,1)

  • UV贴图上颜色相同的地方意味着纹理采样的时候使用了同一位置

  • Flowmap通过上边携带的向量场信息对UV进行了偏移,进而干扰纹理采样的过程,形成扭曲的效果

  • 需要注意,不同的软件uv坐标可能不同,如ue中反转了绿通道(OpenGL和DirectX原点坐标差异)

flowmap的作用

flowmap更接近uv动画而非顶点动画,没有对顶点进行操作,是一种廉价而高效的实现流动效果的方法

不只是水面,flowmap可以用在任何流动的效果上,包括流动的天空球

  • 图为战神中flowmap在天空球中的应用,通过交替出现的云朵可以看出flowmap的典型特征:周期性变化

Flowmap shader

实现思路

  1. 采样Flow map获取向量场信息
  2. 用向量场信息,使采样贴图的UV随时间变化
  3. 对同一贴图以半个周期的相位差采集两次并线性插值,使贴图流动连续

flowmap流动

最简单的随时间偏移的方法:uv - time

  • 为什么不是加?
  • 在uv+(time,0)的情况下,随着时间增加会采样到更远的像素,在视觉上表现为更远距离的像素偏移向该点,与直观感受到的运算法则相反

UV值遵循向量的运算法则,UV偏移时,改变的不是顶点的位置

从Flowmap获取需要的流动方向,再乘上time,就可以让某个点根据flowmap进行流动

  • 使用flow map之前需要将色值0 ~ 1的范围映射到方向向量的范围 -1 ~ 1
//从flowmap获取流向
float3 flowDir = tex2D(_FlowMap,i.uv) * 2.0 - 1.0;

随着时间进行,采样的变形会越来越夸张,因此需要通过frac函数把偏移范围控制在[0,1]之内

float phase = frac(_Time);


这个时候时间到达最大值之后会跳变至0,为了解决这个问题需要构造两层相差半个周期的采样

float phase0 = frac(_Time * 0.1 * _TimeSpeed);
float phase1 = frac(_Time * 0.1 * _TimeSpeed + 0.5);

用相位差半个周期的两层采样进行加权混合,使纹理流动一个周期重新开始时的不自然情况被另一层采样覆盖

//平铺贴图用的uv
float2 tiling_uv = i.uv * _MainTex_ST.xy + _MainTex_ST.zw;//用波形函数周期化向量场方向,用偏移后的uv对材质进行偏移采样
half3 tex0 = tex2D(_MainTex,tiling_uv - flowDir.xy * phase0);
half3 tex1 = tex2D(_MainTex,tiling_uv - flowDir.xy * phase1);//构造函数计算随波形函数变化的权值,使得MainTex采样值在接近最大偏移时权值为0,并因此消隐,构造较平滑的循环
float flowLerp = abs((0.5 - phase0)/0.5);
half3 finalColor = lerp(tex0,tex1,flowLerp);

flowmap修改法线贴图

Flowmap的制作

Flowmap painter

一个可以直接通过笔刷来制作flowmap的简单工具

  • 可以导入纹理预览使用flowmap之后的效果,也可以直接预览flowmap和向量场方向
  • 使用flowmap painter导出的图片本身就在线性空间,导入unity时需要取消勾选sRGB
  • 导入flowmap贴图时需要选择无压缩或高质量,否则贴图变形之后会出现方块

Houdini Labs

安装

Houdini Labs是内置在houdini中的一组游戏开发相关的节点,可以在github中搜索sidefx Labs或着直接在houdini中安装得到

  • 在较早版本的houdini中无法在shelf内找到该工具,只能通过github下载;在这些未被内置到houdini的版本中,这组工具的名称为gamedev

在顶部工具栏中找到sideFX Labs
选择与Hondini对应的版本进行安装

安装完成后重启Hondini即可

节点介绍

首先创建grid节点

  • flowmap需要绘制顶点色,所以grid需要多一些细分

和flowmap相关的节点一共有6个

节点名称 功能
Labs Flowmap 为模型初始化一个向量场v
Labs Flowmap Brush 笔刷绘制修改向量场
Labs Flowmap Obstacle 根据障碍物修改向量场
Labs Guide Flowmap 根据样条线修改向量场
Labs Flowmap to Color 将向量转化为模型顶点色
Labs Flowmap Visualize 可视化,内置flowmap shader
1. Labs Flowmap

Labs Flowmap的作用是初始化向量场,共三种模式

  • Normal 根据顶点法线生成初始v向量
  • Slope 计算梯度生成初始v向量
  • Direction 将所有v向量设为固定方向

2. Labs Flowmap Brush

像梳毛发一样使用笔刷来改变法线的方向

  • Comb Lift 用于调整笔刷模式:0为正常绘制,1为擦除,-1为反向
  • 可进行的操作会显示在视窗最下方
3. Labs Guide Flowmap

两个输入端,一端输入向量场,一端输入设置流向的曲线(可通过draw curve节点绘制曲线)

  • 可用于设定初始流向,再使用笔刷进行细节处理

  • strength:用于控制混合,0时使用原有的向量场,1使用曲线的切线方向

  • effect width : 控制影响范围

  • falloff : 全局影响(在effect width较小时)

  • guide sample count : 修改输入曲线的分段数

4. Labs Flowmap Obstacle

两个输入端,一端输入向量场,一端输入用于碰撞检测的模型

  • Strength决定flowmap受影响的程度
  • Division Size和Dilate Volume用于控制VDB(体素),分别用于体素的细分程度和整体体积
    • Division size不宜过小,一是因为该VDB是空心的,可能会形成壳体,二是细分过多会导致占用大量资源
  • Blur strength用于平滑,避免局部不自然
5. Labs Flowmap to Color

将向量场信息转化为顶点色

  • 这个节点会检测模型是否有UV,如果没有将赋予模型UV
6.Labs Flowmap Visualize

flowmap可视化,用于观察生成的flowmap效果

导出flowmap:Labs Map Baker

输出顶点色,注意调整Gamma值

  • 免费版的Hondini导出后会有巨大的水印…

作业

使用flowmap制作的简单的层云流动的效果

TA入门笔记(十四)相关推荐

  1. 深度学习入门笔记(四):向量化

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  2. Oracle入门(十四)之PL/SQL

    一.PL/SQL 基本语法 PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展. (1) (2) (3) (5) (6) (7)数据类型 Number 数字型 Varchar2 ...

  3. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  4. ROS入门笔记(四):ROS实践(小海龟仿真)— ROS Topics

    ROS入门笔记(四):ROS实践(小海龟仿真)- ROS Topics 文章目录 1 基础知识 1.1 运行ROS Master所在主机的资源地址 1.2 ROS常用命令 1.2.1 查看所有以ros ...

  5. 深度学习入门笔记(四):神经网络

    专栏--深度学习入门笔记 推荐文章 深度学习入门笔记(一):机器学习基础 深度学习入门笔记(二):神经网络基础 深度学习入门笔记(三):感知机 深度学习入门笔记(四):神经网络 深度学习入门笔记(五) ...

  6. 机器学习入门笔记(四):朴素贝叶斯分类

    文章目录 一.朴素贝叶斯法 1.1 实现原理 1.2 后验概率最大化 二.朴素贝叶斯法的参数估计 2.1 极大似然估计 2.2 学习与分类算法 2.3 朴素贝叶斯分类器例题 2.4 贝叶斯估计 推荐文 ...

  7. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:// ...

  8. 【Git入门之十四】Git GUI

    [Git入门之十四]Git GUI - JackyStudio - 博客频道 - CSDN.NET 文章都快写完了,Git GUI才浮出水面,很多人要骂我,这么方便的东西怎么不早拿出来. 当然命令行和 ...

  9. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理

    Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...

  10. 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现

    强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...

最新文章

  1. 4,fail-fast错误机制
  2. (转载)BPM流程管理的将才是你吗
  3. Sublime Text 3包管理及插件主题安装方式
  4. python信号处理教程_python 之信号Signal|python3教程|python入门|python教程
  5. CodeForces - 1405E Fixed Point Removal(线段树+思维)
  6. Taro+react开发(99):问答模块06实现加减
  7. pip安装gluonts
  8. codevs——1044 拦截导弹(序列DP)
  9. 车联网就是车-路-云-图-网
  10. oracle阿拉伯数字转换成汉字,一个阿拉伯数字转中文数字的函数
  11. 音视频-Video标签整理(属性、方法、事件)
  12. 生如夏花之绚烂,Lisp风格的Lialang诞生了!
  13. mvc html禁用文本框,如何在MVC htmlAttribute中設置禁用
  14. 数学规划模型(二):线性规划模型
  15. 分享我成为GDE(Google开发者专家)的经历
  16. linux系统下键盘按键的重新映射——xmodmap工具和xev工具
  17. android Criteria
  18. 负重前行,一步一脚印
  19. Pandas+Seaborn+Plotly:联手探索苹果AppStore
  20. 体积光,体积雾——链接

热门文章

  1. 燕山大学生产实习SSM项目(人事管理系统)
  2. Ubuntu 19.04用wine完美运行微信
  3. Siki_Unity_3-3_背包系统
  4. Android之beginTransaction
  5. java动物类问题_java笔记--动物:具体猫和狗以多态方式写出
  6. Windows11任务栏时钟的秒钟显示
  7. iPhone 12-iPhone屏幕路线图曝光 最近两年新机发布规划流出
  8. 天涯直播筹资300万,七天仅赚14.99万,重启计划岌岌可危
  9. CentOS7多网卡配置(最小化安装)
  10. android checkbox是否选中,Android 中如何处理checkbox的选中、未选中