ShaderForge Rotator节点

一、节点介绍

旋转器

输出的是输入的uv以[piv]为锚点旋转后[ang] (单位为弧度)的uv信息。如果ang没有连线,或者ang连线到time节点上,那么[spd]会控制旋转速度。

二、Rotator节点的输入

1. Piv

Piv是旋转操作的锚点,是一个二维数据(x,y)
uv坐标是从(0,0)->(1,1)的二维坐标系,左下角坐标(0,0),右上角坐标(1,1),中心点坐标(0.5,0.5)
举例:以左下角(0,0)为锚点旋转

2. Ang

旋转的角度(以弧度为单位,2PI为一周)

将弧度换算成角度

角度值 *PI/180 = 弧度值

3. Spd

旋转的速度,默认值为1.0。
- 当Ang是一个常量的时候,Spd作为Ang的倍数,Spd*Ang是作为实际旋转的角度。
- 当Ang是时间变量的时候,Spd控制着旋转的速度。

三、Rotator节点的输出

旋转后的uv坐标


四、小实例 漩涡扭曲效果

如果ang是单个数据,那么uv会整体旋转;
如果ang输入的是一个一维数组,那么我们就可以通过数组来控制对应部位的旋转扭曲的强度。


扭出一朵小花花送给你!~

五、自实现Untiy Shader代码实现Rotator节点的功能

我们来循序渐进的使用书写unity shader代码模拟旋转器节点的功能

1. 围着图片中心匀速旋转

写法

Shader "Hidden/testRotator"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags {"RenderType"="Opaque"}Pass{Name "FORWARD"Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;return o;}sampler2D _MainTex;fixed4 frag (v2f i) : SV_Target{float ang = _Time.y;float spd = 1.0;float2 piv = float2(0.5,0.5);// 计算旋转矩阵float rotateCos = cos(spd*ang);float rotateSin = sin(spd*ang);float2x2 rotateM = float2x2(rotateCos,-rotateSin,rotateSin,rotateCos);// 移动纹理位置,将旋转中心到(0,0)乘以旋转矩阵,再移回原来的位置float2 uvNew = mul(i.uv-piv,rotateM)+piv;fixed4 col = tex2D(_MainTex, uvNew);float3 finalColor = col.rgb;fixed4 finalRGBA = fixed4(finalColor,1);return finalRGBA;}ENDCG}}
}

原理

我们根据ang和spd确定旋转角度,有了旋转角度和旋转中心我们就可以计算出旋转矩阵,将原来的uv乘以旋转矩阵就得到了新的uv

绕任意点的二维旋转

绕原点的旋转是二维旋转最基本的情况,当我们需要进行绕任意点旋转时,我们可以把这种情况转换到绕原点的旋转,思路如下:
1. 首先将旋转点移动到原点处
2. 绕原点的旋转
绕原点旋转θ的矩阵如下所示:

3. 再将旋转点移回到原来的位置
参考:旋转变换(一)旋转矩阵

效果展示

2. 可调节旋转的锚点位置,旋转角度

以锚点位置为中心,旋转ang*spd大小

写法

Shader "Hidden/testRotator"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Ang ("Ang", Range(0.0, 6.28)) = 0.0_PivX("Pivot X",Float) = 0.5_PivY("Pivot Y",Float) = 0.5}SubShader{Tags {"RenderType"="Opaque"}Pass{Name "FORWARD"Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;return o;}sampler2D _MainTex;float _Ang;float _PivX;float _PivY;// float _spd;fixed4 frag (v2f i) : SV_Target{float ang = _Ang;// float ang = _ang;float spd = 1.0;// float spd = _spd;float2 piv = float2(_PivX,_PivY);// 计算旋转矩阵float rotateCos = cos(spd*ang);float rotateSin = sin(spd*ang);float2x2 rotateM = float2x2(rotateCos,-rotateSin,rotateSin,rotateCos);// 移动纹理位置,将旋转中心到(0,0)乘以旋转矩阵,再移回原来的位置float2 uvNew = mul(i.uv-piv,rotateM)+piv;fixed4 col = tex2D(_MainTex, uvNew);float3 finalColor = col.rgb;fixed4 finalRGBA = fixed4(finalColor,1);return finalRGBA;}ENDCG}}
}

设置Ang,Piv属性,在Inspector面板中控制属性值

效果展示

3. 可调节旋转的锚点位置,旋转速度

写法:

Shader "Hidden/testRotator"
{Properties{_MainTex ("Texture", 2D) = "white" {}// _Ang ("Ang", Range(0.0, 6.28)) = 0.0_PivX("Pivot X",Float) = 0.5_PivY("Pivot Y",Float) = 0.5_Spd("Spd", Range(0.0,10.0)) = 1.0}SubShader{Tags {"RenderType"="Opaque"}Pass{Name "FORWARD"Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;return o;}sampler2D _MainTex;// float _Ang;float _PivX;float _PivY;float _Spd;fixed4 frag (v2f i) : SV_Target{float ang = _Time.y;float spd = _Spd;float2 piv = float2(_PivX,_PivY);// 计算旋转矩阵float rotateCos = cos(spd*ang);float rotateSin = sin(spd*ang);float2x2 rotateM = float2x2(rotateCos,-rotateSin,rotateSin,rotateCos);// 移动纹理位置,将旋转中心到(0,0)乘以旋转矩阵,再移回原来的位置float2 uvNew = mul(i.uv-piv,rotateM)+piv;fixed4 col = tex2D(_MainTex, uvNew);float3 finalColor = col.rgb;fixed4 finalRGBA = fixed4(finalColor,1);return finalRGBA;}ENDCG}}
}

效果展示

4.自实现漩涡扭曲效果

写法

Shader "Hidden/testRotator"
{Properties{_MainTex ("Texture", 2D) = "white" {}_AngTex ("Ang Texture", 2D) = "white" {}_PivX("Pivot X",Float) = 0.5_PivY("Pivot Y",Float) = 0.5_Spd("Spd", Range(0.0,10.0)) = 1.0}SubShader{Tags {"RenderType"="Opaque"}Pass{Name "FORWARD"Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;return o;}sampler2D _MainTex;sampler2D _AngTex;float _PivX;float _PivY;float _Spd;fixed4 frag (v2f i) : SV_Target{float4 colAng = tex2D(_AngTex, i.uv);float ang = colAng.r;float spd = _Spd;float2 piv = float2(_PivX,_PivY);// 计算旋转矩阵float rotateCos = cos(spd*ang);float rotateSin = sin(spd*ang);float2x2 rotateM = float2x2(rotateCos,-rotateSin,rotateSin,rotateCos);// 移动纹理位置,将旋转中心到(0,0)乘以旋转矩阵,再移回原来的位置float2 uvNew = mul(i.uv-piv,rotateM)+piv;fixed4 col = tex2D(_MainTex, uvNew);float3 finalColor = col.rgb;fixed4 finalRGBA = fixed4(finalColor,1);return finalRGBA;}ENDCG}}
}

效果展示


同样一朵小花出现啦!~

参考:

Unity3D开发之Shader实现扭曲效果

【shaderforge学习笔记】 Rotator节点相关推荐

  1. Ajax学习笔记-动力节点-王鹤老师

    Ajax学习笔记-动力节点-王鹤老师 视频教程来自:https://www.bilibili.com/video/BV15k4y167XM?spm_id_from=333.999.0.0 第一节 全局 ...

  2. 【shaderforge学习笔记】 Parallax节点(视差节点)

    shaderforge Parallax节点 一.官方说明 Parallax节点输出的uv是输入的uv经过视差偏移的得到结果,其中视差偏移程由[Hei]指定,[Hei]在计算偏移量时有两个相关参数:深 ...

  3. 【shaderforge学习笔记】 UVTile节点

    shaderforge UVTile节点 一. 介绍 UVTile UVTile可以用来以uv坐标为基准在一个纹理中取到其中一块的贴图. [UV]是整个贴图的UV值 [Wid]指定沿tilemap的x ...

  4. 【shaderforge学习笔记】 Hue节点(色相节点)

    shaderforge 色相节点 一.官方说明 根据Hue值输出RGB值,换句话说Hue节点的作用是,将Hue值转为相应的RGB值. 二.节点输入 Hue值 Hue节点输入值的[0,1]对应色相轮的[ ...

  5. 【shaderforge学习笔记】 Vector Operations(向量运算)

    shaderforge 向量运算 Append数据维度的附加 Component Mask数据维度的分解 Channel Blend通道混合 Cross Product叉积 Desaturate去色 ...

  6. js学习笔记15----子节点和兄弟节点的操作

    1.元素.firstChild : 只读属性,第一个子节点 标准下:会包含文本类型的子节点. 非标准下:只包含元素类型子节点. 元素.firstElementChild : 只读属性,第一个元素子节点 ...

  7. 史上最全SpringBoot学习笔记-动力节点王鹤(2021最新版)

    SpringBoot 资料官方下载地址 动力节点springboot资料 视频观看地址 https://www.bilibili.com/video/BV1XQ4y1m7ex 第一章 JavaConf ...

  8. JDBC学习笔记-动力节点

    JDBC (B站动力节点杜老师) 1.JDBC是什么 2.jdbc的本质是什么? 多态: ​ Animal a = new Cat ( ) -->面向抽象编程 父类型的引用 指向 子类型的对象 ...

  9. 【shaderforge学习笔记】 Specular(高光)通道

    shaderforge Specular通道 一.官方介绍 这是材质的高光的颜色.值越高越亮,如果高光值为黑色则完全不会影响shader的表现. 二.通道的输入 1. Specular 可以是高光贴图 ...

最新文章

  1. [bzoj1934][Shoi2007]Vote 善意的投票
  2. python动态语言解释_python是动态语言吗
  3. Python 交叉验证模型评估
  4. POJ-3067 Japan(树状数组、线段树)
  5. 发放MindMeister内测邀请,仅20
  6. SQL Server 2014内存优化表的使用场景
  7. oracle 大页配置,【Oracle】Oracle如何开启大页
  8. php 删除上传文件,php实现文件上传、下载和删除的方法
  9. mysql本周数据没有填充_MySql查询本周、本月、本年数据(没有数据则补全0)
  10. html怎么从左到右设置颜色,css3文字颜色从左到右动画
  11. 高响应比优先调度算法 (HRRN)例题
  12. ff7重制版青魔法_狂父重制版发布+妖精的尾巴首次打折¥244+最终幻想4解锁国区新增中文...
  13. The VMRC console has disconnected solution
  14. [网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
  15. 永洪BI悬停效果展示---第三集
  16. 数据库同步——中间数据库的实现方式
  17. 第一阶段冲刺 博客评价
  18. 关于举办“2020·中国边缘计算企业20强”榜单评选通知
  19. 计算机云的使用方法,云电脑教程:云电脑怎么用?
  20. vue---双向绑定

热门文章

  1. win10 高DPI 高分屏 解决模糊问题的方法
  2. Python学习笔记---day12函数进阶
  3. 编写.bat执行jar包
  4. 网咖虚拟服务器主机,为什么网吧的主机这么便宜??但是玩大型游戏又不卡
  5. 2014华中首届手游创意大赛
  6. JavaScript 笔记之数组
  7. OGG-01008 Extract displays Discarding bad record (discard recs=1) when using filter or where clause
  8. Project Euler 3
  9. 弱加密算法有哪几种_常见的几种加密方法
  10. EPICS IOC Shell