【Unity Shader】树叶晃动效果原理及实现

1 树叶晃动原理

在模型空间下,对顶点进行X轴和Y轴上的偏移。

1.1 方法

通过计算顶点与Y轴单位向量的点积求得stage1。通过计算顶点与X轴单位向量的点积,加上时间分量_Time.y,求其正弦值stage2。将stage1/stage2与向量(0.001, 0, 0.001)相乘得到偏移值。
在这里插入图片描述

1.2 公式

V o f f s e t = ( V ⋅ x 1 ) ∗ s i n ( ( V ⋅ y 1 ) + _ T i m e . y ) ∗ z 1 V_{offset}=(V \cdot x_{1}) * sin((V \cdot y_{1}) + \_Time.y ) * z_{1} Voffset=(Vx1)sin((Vy1)+_Time.y)z1

其中 V V V是顶点坐标, x 1 x_{1} x1 y 1 y_{1} y1分别位X轴和Y轴单位向量, z 1 = ( 0.001 , 0 , 0.001 ) z_{1}=(0.001,0,0.001) z1=(0.001,0,0.001)

2 单个面片晃动实现

在这里插入图片描述

在这里插入图片描述

3 整个树木晃动实现

在这里插入图片描述

4 Shader代码

  • 树叶纹理贴图资源下载
  • 树木模型资源下载
Shader "Unlit/MyTreeShader"
{Properties{_MainTex ("纹理图片", 2D) = "white" {}_Strength("摇摆幅度", Float) = 1_Speed("摇摆速度", Float) = 3_AoColor("基础色", Color) = (1,1,1)_ShadowColor("阴影色", Color) = (1,1,1)_Specular("高光色", Color) = (1,1,1)_Gloss("光泽度", Float) = 1}SubShader{  Pass{//指明该Pass的光照模式Tags {"LightMode" = "ForwardBase"}Cull OffCGPROGRAM#pragma vertex vert#pragma fragment frag//包含进Unity的内置变量#include "UnityCG.cginc" #include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float4 color : COLOR0;float3 normal: NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;float4 color: TEXCOORD1;float3 worldNormal: TEXCOORD2;float3 worldPos : TEXCOORD3;};sampler2D _MainTex;float4 _MainTex_ST;fixed3 _AoColor;float _Speed;float _Strength;fixed3 _ShadowColor;fixed3 _Specular;float _Gloss;v2f vert (appdata v){v2f o;float3 worldPos = UnityObjectToWorldDir(v.vertex);float stage1 = dot(v.vertex, float3(0, 1, 0)) * _Strength;float stage2 = sin(dot(v.vertex, float3(1, 0, 0)) * _Strength + _Time.y * _Speed);float3 stage3 = stage1 * stage2 * float3(0.001, 0, 0.001) * v.color.a;                o.pos = UnityObjectToClipPos(v.vertex + stage3);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.color = v.color;o.worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}fixed4 frag (v2f i) : SV_Target{// sample the texturefixed4 col = tex2D(_MainTex, i.uv);clip (col.a - 0.5);// 世界空间下的法线fixed3 worldNormal = i.worldNormal;// 世界空间下光源方向fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);// 漫反射fixed3 diffuse = _LightColor0.rgb * col.rgb * _AoColor* lerp(_ShadowColor, float3(1,1,1), i.color.rgb)* (dot(worldNormal, worldLightDir) * 0.5 + 0.5);// 环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * col.rgb;// 世界空间下的视角方向fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);// 世界空间下的half方向fixed3 halfDir = normalize(worldLightDir + viewDir);// 高光fixed3 specular =  _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(halfDir, worldNormal)), _Gloss);return fixed4(diffuse + ambient + specular, col.a);}ENDCG}}
}

5 关于树木颜色

5.1 漫反射

树木的漫反射使用半兰伯特光照模型,同时使用环境光、贴图颜色和阴影颜色插值。其中阴影颜色插值是使用自定义阴影色、纯白色和模型顶点颜色三者做lerp运算得到的。公式如下
C s h a d o w = L e r p ( _ S h a d o w C o l o r , f l o a t 3 ( 1 , 1 , 1 ) , V c o l o r ) C_{shadow} = Lerp(\_ShadowColor, float3(1,1,1), V_{color}) Cshadow=Lerp(_ShadowColor,float3(1,1,1),Vcolor)
其中 _ S h a d o w C o l o r \_ShadowColor _ShadowColor为自定义阴影颜色, f l o a t 3 ( 1 , 1 , 1 ) float3(1,1,1) float3(1,1,1)则是纯白色, V c o l o r V_{color} Vcolor则是模型顶点颜色。

其中 L e r p Lerp Lerp函数的计算公式为:

L e r p ( a , b , w ) = a + ( b − a ) ∗ w Lerp(a, b, w) = a + (b - a) * w Lerp(a,b,w)=a+(ba)w

w = 0 w=0 w=0时, L e r p ( a , b , w ) = a Lerp(a, b, w) = a Lerp(a,b,w)=a;当 w = 1 w=1 w=1时, L e r p ( a , b , w ) = b Lerp(a, b, w) = b Lerp(a,b,w)=b

所以 L e r p Lerp Lerp函数的意义是根据参数 w w w a a a~ b b b之间取一个合适的插值。当 w w w为线性变化时,则 L e r p Lerp Lerp函数取值就会呈线性变化。

通过调节基础色和阴影色,进行漫反射颜色的设置。

5.2 高光反射

使用Blinn-Phong光照模型,可通过调节高光色和光泽度两个参数进行高光的设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/354247.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

blender 2.8制作面片树叶的shading node设置

1. 创建Pricipled BSDF材质,并设置材质Settings的Blend Mode为Alpha Blend模式! 2. 在shading窗口内设置节点: 添加下列节点 Texture Coordinate Mapping Image Texture Image Texture Transparent BSDF Principled BSDF Mix Shader Material Output…

【UE4 Material 101学习笔记】 :Lec08/10/11/12 视差贴图的应用/布料着色/体积冰效果/树叶摇动

Lec08 视差贴图 原理 LearnOpenGL视差贴图 1. 使用高度图偏移UV 未使用高度贴图偏移UV时 使用之后,表面不平坦产生的阴影会更为明显一些。 当角度较大时,失真比较明显。 2. 视差遮蔽映射(Parallax Occlusion Mapping) 可弥…

UE风格化Day19-树叶材质

材质蓝图的基础技巧 补充一些材质蓝图的基础技巧,虽然比较基础,但是刚开始学的时候完全没有教程专门提到这个: 材质的管理一般分为:材质函数、材质、材质实例 首先网格体一般挂的材质就是用材质实例,当然也可以直接挂…

Quixel megascans模型材质贴图合集包

Quixel megascans是一个在线高分辨率扫描模型和贴图库,一致的PBR校准的表面,植被,和三维扫描模型,还包括用于管理的桌面应用、混合和输出你的扫描数据的程序。它的产品已经与游戏和电影工作室合作。 quixel megascans可以帮助您创…

自动化测试Junit

目录 Junit5注解TestDisabledBeforeAll、AfterAll、BeforeEach、AfterEach 参数化单参数多参数CSV获取参数方法获取参数 测试用例执行顺序断言 assert断言相等断言不相等断言为空断言不为空 测试套件 自动化测试项目1. 熟悉项目2. 针对核心流程设计手工测试用例3. 将手工测试用…

解释PBR纹理贴图(texture-maps)

纹理贴图,不管你是学习sp绘制纹理,还是利用渲染器创造艺术作品,接触到PBR流程,总要面对各种贴图。我在学习的时候,有时候搞得懂,有时候糊里糊涂,我想还是要做个笔记的,好记性不如烂笔…

PBR贴图基础知识

PBR贴图基础知识 一,基础知识二,PBR贴图类型传统次世代方式PBR次世代方式1,金属度粗糙度流程---Base ColorMetallicRoughness2,反射度光滑度流程---Diffuse/AlbedospecularGlossiness/Smoothness3,通用贴图类型法线贴图…

UE4 Material 101学习笔记——08-12 凹凸和视差贴图/纹理压缩/布料/体积冰/摇曳树叶

UE4 Material 101学习笔记——08-12 凹凸和视差贴图/纹理压缩/布料/体积冰/摇曳树叶 Lec08 凹凸和视差贴图 Bump Offset and Parallax Occlusion MappingLec09 纹理压缩与设置 Texture Compression and SettingsLec10 布料着色器 Cloth Shading10.1 了解布料10.2 布料shader Le…

技术美术个人笔记(十四)——Houdini程序化树木

前言:关于大地形美术资产制作部分的houdini程序化树木部分,原houdini内置有Labs Quick Basic Trees节点,以下步骤均基于此节点优化魔改; 效果预览: tip:其中树叶贴图及地形颜色变化通过在材质中对贴图采样…

CSS3+js绘制3D圣诞树

最近大家都在用代码写圣诞树,我也跟个风吧! 主要技术: 1.CSS3的3D变换 2.DOM动态添加节点 开发环境:vscode 目录 一.引入 二、基本知识 1.CSS3的3D变换 (1).空间直角坐标系 (2).transform详解 (3).transform-style 2.DOM节点…

unity透明通道加颜色_树叶透明贴图的制作原理及渲染!

对于很多刚开始接触渲染模块的同学来说,不知道透明贴图的制作原理,以及如何渲染出好的效果,今天结合案例给大家讲解一下,先打开我们需要的素材,如下图: 在制作之前我们先给树叶一个普通的blinn材质&#xf…

SpringBootWeb案例-2(上)

前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能,还有两个需要实现: 新增员工修改员工 首先我们先完成"新增员工"的功能开发,再完成"修改员工"的功能开发。而在"新增员工"中&…

微调样本质量胜于数量 LIMA: Less Is More for Alignment

1、总体介绍 大型语言模型的训练分为两个阶段:(1)从原始文本中进行无监督的预训练,以学习通用的表征;(2)大规模的指令学习和强化学习,以更好地适应最终任务和用户的偏好。 作者通过…

XP系统如何把文本转换成html,xp系统下将HTML文件设置为屏保的方法

关于XP系统的屏保设置,很多人脑子中肯定有个固定的样式,因为按照XP系统的传统来说,都是固定的按照图片来设置的,所以很多人就对屏保有了一定的硬性思维,就是只能是图片的形式。其实这样的想法是有所偏差的,…

linux6禁用屏幕保护程序,禁用屏幕保护程序(ScreenSaver Disabled)

禁用屏幕保护程序ScreenSaverDisabled是一款可以帮助用户朋友让自己的电脑不要总是被屏幕保护影响,有些设置隔三差五就会进入屏保状态,使用这款禁用屏幕保护程序ScreenSaverDisabled可以帮您解决这个烦恼。 相关软件软件大小版本说明下载地址 禁用屏幕保…

xp系统怎么定时锁定计算机,电脑怎么设置自动锁屏_XP系统电脑怎么设置自动锁屏...

摘要 腾兴网为您分享:XP系统电脑怎么设置自动锁屏,字体配置,智慧大学,掌上新华,小t智联等软件知识,以及mp3音乐裁剪器,小霸王,屏幕分屏软件,湖北网上税务局,照片印刷&…

汉字时钟屏保软件/汉字时钟电脑屏幕保护下载/汉字时钟屏保/windows屏保

软件名称:冷高轮时间汉字时钟屏保 软件语言:简体中文 软件类别:桌面工具 软件授权:免费软件 适用平台:WinXP, Win7, Win8, Win10, WinAll 电脑壁纸下载可在wallpaper engine或者upupoo上搜索全称“冷高轮时间‘ …

xp系统计算机不休眠设置,xp和win7系统怎么设置电脑不休眠详细教程

百度音乐播放器2017v10.1.8 官方最新版 类型:音频播放大小:14.3M语言:中文 评分:9.4 标签: 立即下载 电脑的休眠和睡眠的状态是什么样的? 休眠:就是把应用环境保存在硬盘上,直白地说…

电脑显示无法启动程序 因为计算机丢失,电脑显示无法启动此程序丢失.dll文件怎么办...

电脑显示"无法启动此程序"丢失.dll文件怎么办 【百度经验方法】

用vb写计算机程序代码,用VB编写的抽奖程序源代码随机抽取不重复

年度抽奖的小程序,可以自定义 年度抽奖小程序,您可以自定义背景,抽奖形式,设置奖品等. PPT彩票小程序 PPT开发工具彩票代码,VBA代码,每个需要它的人都可以下载.