顶点程序经典案例——树木生长

91 篇文章 77 订阅
订阅专栏

返回目录

树木生长Shader

一、介绍

大家好,我是阿赵。这次来做一个树木生长的Shader。
顶点程序作为整个渲染管线里面和片段程序并列的两大可控过程之一,一直存在感都比较低。我们平时制作的效果,很多都是在片段程序里面实现的计算,顶点程序一般只是用来计算一下坐标系转换。
这次介绍的树木生长shader,我个人感觉是顶点程序的一个比较经典的应用,通过控制模型的顶点,做出一棵树的生长动画,还是比较有意思的。
另外一个知识点,就是黑白遮罩的运用。在深入学习各种效果的Shader编写之后,会发现很多效果的计算基础,都是模型不同部位的黑白颜色分布的计算。比如说透明度的计算,黑透白不透,比如边缘光的计算,边缘计算出白色,内部计算出黑色,等。
这个例子里面,黑白色控制了顶点是否显示,控制了树木生长的边缘,控制了刚长出来的部分的颜色,诸如此类。如果明白了黑白关系,在编写Shader的道路上,可以说是跨进了一大步。
其实我知道我在一开始写这么多废话,一般也不会有人看的。所以还是快点说制作过程吧。完整Shader在最后面。

二、制作过程说明

1、准备工作:

看到上面的视频,可能有些朋友会说,是不是直接在3DsMax里面做一段动画,然后直接在Unity里面播放呢?
其实不是的。我这里只在3DsMax里面准备了一棵树的模型,它包括了树干和树叶2个部分。
在这里插入图片描述

把模型导出fbx然后导入Unity后,把贴图附上,会看到这个模型的效果如下,并没有任何的动画。
在这里插入图片描述

地面是为了好看我随便找了一张贴图赋予了一个地面,这个不重要,我们只要关系树干和树叶就行了。

2、展UV

先说一下,为什么树木能实现生长的效果。
为了让树木能从根部到顶部,再到树叶逐渐的出现,我必须找到一个信息,是从树木根部一直到叶子渐变的。为了看得比较清晰,我先把叶子隐藏了,单纯用树干来做说明。
在这里插入图片描述

这种信息可以有很多,举个例子:
1.顶点颜色
2.UV坐标
3.贴图颜色
4.顶点坐标

通过这些手段,理论上都能实现到这种渐变的效果。但顶点坐标只能是从上到下,或者从左到右之类线性的控制,这里的树枝有可能是横向纵向甚至是拐弯的,所以并不适合用顶点坐标来做。所以我们可以在顶点颜色、UV坐标、贴图颜色这些数据里面选择一种比较容易实现的来做,都无所谓。
我这里选择的是UV坐标。

由于模型已经有了UV1信息用于漫反射贴图的UV坐标计算了。所以我要展一个UV2。
在这里插入图片描述

展完之后的UV2大概是这个样子的,我使用了uv的u坐标,从左往右在0-1的区间渐变。
把展好UV后的模型导入到Unity,然后单独显示一下我们需要的坐标看看。

3、检查UV信息显示

这里插一个知识点,介绍一下怎么单独去看模型的某个数据。
比如我现在要看UV2的信息,我可以在顶点程序里面先读取了uv2信息传入到片段程序,然后在最后的输出时

return half4(i.uv2.xxx,1);

这样,就可以单独把我们需要的信息当做颜色显示出来。
我这里的UV2的u坐标信息,显示完是这样的:
在这里插入图片描述

可以看到,现在树干从根部到树枝,是有一个由黑到白的渐变。
如果我想把颜色反过来,根部是白色,树枝是黑色,可以这样:

float val = 1- i.uv2.x
return half4(val.xxx,1);

这样,就能得到了之前显示的那个渐变效果了:
在这里插入图片描述

4、控制黑白渐变的过程

上面的黑白渐变图,发现有一个问题,就是黑白渐变的区域太大了,我们想做树木生长,一般是需要有一个比较明显的黑白分割线过渡的。
为了实现过渡范围的控制,可以使用smoothstep方法来控制:

float v2Val = 1 - v.uv2.x;
float heightVal = saturate(v2Val + _height);
float growVal = smoothstep(_min, _max, heightVal);

还是那个规则,黑的地方不显示,白的地方显示,所以就可以得到下面这个效果,可以看看黑白范围和最后显示效果的对比:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5、根据法线方向做树枝大小缩放

树木的生长并不是圆柱形生长出来,而是生长出来的地方是尖的,长出一段距离之后才慢慢变粗。
这个效果实现起来不难,还是刚才的黑白图过渡部分,我们可以使用黑白关系,然后加上模型顶点法线的方向,来做一个顶点沿着法线方向的缩放。
由于模型显示的过渡范围和变尖的过渡范围可能不一致,所以虽然都是用smoothstep来控制范围,但min和max的值可以不一样。

float v2Val = 1 - v.uv2.x;
float heightVal = saturate(v2Val + _height);
float growVal = smoothstep(_min, _max, heightVal);
heightVal = smoothstep(_endMin, _endMax, heightVal);

在这里插入图片描述
在这里插入图片描述

6、生长颜色的变化

最后,我还想实现一种效果,在树木刚长出来的时候,颜色是比较浅的,然后到了生长完成的时候,颜色会变深:
在这里插入图片描述
在这里插入图片描述

为了实现这种效果,我继续利用了刚才的黑白渐变过渡的信息,给他叠加一个颜色:

half3 diffuseCol = (1 - i.growVal)*_growCol + col.rgb;

这样在过渡的部分,就会乘以一个growCol,在生长完成之后,就纯是漫反射贴图的颜色。

7、树叶部分

其实刚才我们已经把整个shader做完了。树叶的部分,实际上不需要额外写shader去实现,因为展UV的时候,树叶也是根据出现的先后顺序,展UV在树枝的后面的。
在这里插入图片描述

这里我比较的偷懒,把相同形状的树叶的UV展在了一起了,所以实际出现的效果,就是同样形状的树叶会一起长出来。如果想效果更真实有点,可以根据整棵树的树枝生长先后顺序,来排列这些树叶的UV2.
在这里插入图片描述
在这里插入图片描述

三、完整shader

Shader "azhao/TreeGrow"
{
    Properties
    {
		_MainTex("Texture", 2D) = "white" {}
		_AlphaMap("AlphaMap", 2D) = "white" {}
		_height("height", Range(-1 , 1)) = 0
		_min("min", Range(0 , 1)) = 0
		_max("max", Range(0 , 1)) = 1
		_endMin("endMin", Range(0 , 1)) = 0
		_endMax("endMax", Range(0 , 1)) = 1
		_growCol("growCol", Color) = (0,1,0,0)	
    }
    SubShader
    {
		cull off
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag


            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
				float2 uv2 : TEXCOORD1;
				float3 normal:NORMAL;
            };

            struct v2f
            {
				float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
				float2 uv2 : TEXCOORD1;
				float growVal : TEXCOORD2;
                
            };
			uniform float _min;
			uniform float _max;
			uniform float _height;
			uniform float _endMin;
			uniform float _endMax;
			uniform sampler2D _MainTex;
			uniform float4 _MainTex_ST;
			uniform float4 _growCol;
			uniform sampler2D _AlphaMap;


            v2f vert (appdata v)
            {
                v2f o;                
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.uv2 = v.uv2;
				float v2Val = 1 - v.uv2.x;
				float heightVal = saturate(v2Val + _height);
				float growVal = smoothstep(_min, _max, heightVal);
				heightVal = smoothstep(_endMin, _endMax, heightVal);
				heightVal = max(heightVal, growVal);
				float3 offsetVal = v.normal*heightVal - v.normal;
				o.vertex = UnityObjectToClipPos(v.vertex+ float4(offsetVal,1));
				o.growVal = growVal;
                return o;
            }

            half4 frag (v2f i) : SV_Target
            {
                half4 col = tex2D(_MainTex, i.uv);
				half3 diffuseCol = (1 - i.growVal)*_growCol + col.rgb;
				half4 alphaCol = tex2D(_AlphaMap, i.uv);
				float alpha = alphaCol.r*i.growVal;
				clip(alpha - 0.5);
				return half4(diffuseCol,alpha);
            }
            ENDCG
        }
    }
}
爆炸、植物生长特效
08-21
具有一些爆炸效果、和植物生长过程的特效集,导入直接使用!
Visual C++游戏开发经典案例详解.pdf
03-01
《Visual C++游戏开发经典案例详解》这本书是针对使用Visual C++进行游戏开发的专业指南,旨在帮助读者通过实例学习和掌握C++编程语言在游戏开发中的应用。书中的内容覆盖了从基础到高级的游戏开发技术,包括图形...
Unity URP ShaderGrapgh制作藤蔓生长
qq_55895529的博客
06-27 372
Unity URP ShaderGrapgh制作藤蔓生长
Unity树叶shader
qq_42877866的博客
01-18 535
树叶贴图的RGB的G小于设定的颜色阈值的话将会被视为透明。
【SpeedTree笔记】利用SpeedTree制作生长动画,并导入unity
Allen7474的专栏
09-10 6739
利用SpeedTree制作生长动画,并导入unity 目录: SpeedTree导出ABC 导入unity 一、SpeedTree导出ABC 使用版本 Time设定生长动画 导出设置 二、导入unity 安装Alembic插件 TimeLine时间轴添加Alembic Track ...
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)
热门推荐
向宇
06-25 1万+
ShaderGraph是Unity中的一个可视化工具,用于创建和编辑图形着色器。其意义在于简化编写复杂着色器的过程,减少对具体编程语言的依赖,使艺术家和设计师可以更方便地创建各种美术效果。使用ShaderGraph可以通过图形界面设置着色器属性,包括颜色、纹理、光照等,并在视窗预览中即时显示结果,从而快速迭代和调整着色器。使用ShaderGraph需要先安装Unity 2018.1或以上版本,并添加ShaderGraph插件。打开ShaderGraph面板后,可以通过拖放节点并连接它们来创建着色器。
用于web展示的智慧农业植物生长动画模型的快速实现
Ceichaos的博客
12-11 3703
在下最近在进行智慧农业的项目过程中对有关植物生长的动画模型做了一番研究,最后把植物生长的过程在web页面进行展示,并进行控制,实现项目需求 主要使用的工具是c4d和unity 先来解析一下植物生长动画模型的难点,首先植物生长动画是区别于其他几种模型动画的,常见的几种分类动画: 骨骼动画一般是完整模型加以绑定骨骼特征,然后通过控制骨骼对包括人物或其他事物模型进行运动模拟处理,从而形成动画,使人物动起来,类似mmd这种 粒子动画是通过粒子发生器生成粒子并进行一定的处理,从而把无形物变为有形物使之运动,生
ShaderForge生长动画——基于模型UV生长
u013293580的博客
12-16 4119
 通过ShaderForge制作一个模型出场的Shader,具体效果如下: 效果图 这种模型自下而上的出场效果有一下集中方法可以实现: 1使用遮罩材质覆盖模型,控制遮罩动画 2使用shdaerForge基于模型UV控制模型显示 3使用shaderForge基于模型位置控制模型显示 本文中具体介绍第二种实现方法,与大部分溶解消散的效果类似,控制模型消失的重要节点是OpacityClip...
houghbianhuan.rar_四边形顶点_经典hough
09-23
标题中的“houghbianhuan.rar_四边形顶点_经典hough”指的是使用经典霍夫变换(Hough Transform)来检测图像中的四边形顶点。这是一种在计算机视觉和图像处理领域广泛使用的算法,主要用于检测直线和曲线。在这个...
3dmax插件——顶点清理插件
11-29
"3Dmax插件——顶点清理插件"就是专门针对这一需求设计的工具,它能够帮助用户高效地处理模型中的顶点问题。 顶点清理插件的主要功能是消除模型中的冗余顶点和无用顶点。在3D建模中,顶点是构成几何形状的基本元素...
unity3d模型 Nobiax Plant Pack 植物森林 自然花草树木
03-18
unity3d的花草树木模型,喜欢的可以试一试。
基于图块的作物生长机制:Unity 3D中基于图块的作物生长机制,类似于Stardew Valley
02-05
Unity中的可种植作物 该存储库适用于那些希望获得灵感以使用Unity 3D Tilemaps使用某种增长机制来构建游戏的用户。 如果您熟悉Stardew山谷的农作物,那么这个项目的目的就是要像这样。 屏幕截图 实施设计 TLDR; 基于协程的增长系统,该系统调用所有订阅者(作物)的事件以更改其子画面。 当时我还没有关于如何使用Unity的tilemap实施作物生长的教程或文档,因此我决定发布自己的实施方案。 这可能不是最好的方法,但是对于我的目的来说效果很好。 基本上CropTile是一种GameTile ,可以克隆到tilemap并与有一些相似之处,因此AnimatedTile在
常春藤植物生长插件含教程 Ivy Grower
12-09
常春藤植物生长插件含教程 Ivy Grower,有名的藤蔓植物生长插件,非常易用,效果也不错,推荐给有需要的朋友
unity3d超漂亮的动态天空盒 风吹树动效果
07-01
unity3d超漂亮的动态天空盒 风吹树动效果源码
unity3d植物模型
06-30
用于植物种植,包含各种植物,花草树都有,希望能对大家有帮助
卫兵布置问题_卫兵布置问题_算法程序设计——卫兵布置问题_
09-29
卫兵布置问题,也称为守卫布置问题,是图论中的一个经典问题,与最优化策略密切相关。在该问题中,假设有一座城堡或区域,需要通过最少数量的卫兵来覆盖其所有可视部分,使得从任何一点都能看到至少一个卫兵。这通常...
net游戏编程源入门经典——C#篇
07-15
《.NET游戏编程源入门经典——C#篇》是一本专为初学者设计的书籍,旨在引导读者通过C#语言进入游戏开发的世界。C#是.NET框架中的主要编程语言,尤其在游戏开发领域中有着广泛的应用,如Unity引擎就以其为首选语言。...
unity】模型裁剪shader(建筑生长动画)
最新发布
发布unity,三维模型的相关内容
07-21 1226
使用的核心方法是clip,当传入正值时渲染,传入负值时不渲染。定义一个裁剪向量,使用裁剪向量和模型点点乘,如果模型点和裁剪向量是同一个方向,点乘为正,相反为负。
UnityShader 漫反射(兰伯特与半兰伯特光照模型-逐顶点和逐像素光照)
起个名字好难啊
05-15 2726
漫反射效果漫反射是指投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这种反射的光称为漫射光。很多物体,如植物、墙壁、衣服等,其表面粗看起来似乎是平滑,但用放大镜仔细观察,就会看到其表面是凹凸不平的,所以本来是平行的...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 2019年第一次画画,顺便评价一下ipadPro和Surface的画画优劣 34706
  • 面向对象的概念介绍 22043
  • 解决部分手机读取obb失败的问题 17295
  • unity自带寻路Navmesh入门教程(一) 17259
  • MaterialPropertyBlock 17180

分类专栏

  • ZBrush使用 2篇
  • 虚幻引擎(UE) 47篇
  • 系列文章目录 9篇
  • Unity引擎Shader效果 91篇
  • Unity屏幕后处理 10篇
  • TA通用技术 19篇
  • MaxScript 20篇
  • Unity功能与问题解决 46篇
  • Unity资源管理相关 8篇
  • 程序基础 12篇
  • 寻路和智能 9篇
  • 3D打印 16篇
  • 行业杂谈 43篇

最新评论

  • FDM3D打印系列——宝可梦妙蛙种子

    阿赵3D: 我也是下载的,你去创想云的网站搜索一下就有了

  • FDM3D打印系列——宝可梦妙蛙种子

    大泡泡酱: 请问可以发一下文件吗,好喜欢,但自己建不出来表情包

  • MaxScript编写bone转换biped工具

    阿赵3D: 我不确定我是不是看懂了你说的问题,所以我说的也不一定是你想要的。假如是非biped的骨骼,我的理解其实就是普通的物体了,那就按正常的来计算父子的矩阵关系就好了。如果有biped和非biped混用,那也可以先各自计算,然后再做父子连接的处理。

  • MaxScript编写bone转换biped工具

    qq_33192133: 当然我尝试分析过您的代码 奈何技术力比较有限未能找到解决方案

  • MaxScript编写bone转换biped工具

    qq_33192133: 不好意思 又来打扰您了。谢谢您当时的回复,现在我想向您请教一下 怎么去处理bip的旋转角度呢? 比如fbx的骨骼非bip骨架,它的一部分骨骼的轴向和biped的骨架轴向是不一致的。怎么让它能够正确的适配非bip的骨架呢。现在我了解了一些关于bip的maxscript的函数定义。测试了一下 缩放以及位置的定位是没有问题的。但是在旋转上遇到了难度。在逻辑中 没相处怎么去处理他们的矩阵对应的角度差去赋值给bip去匹配 当然也可能我的思路是错的。故来这里在打扰您一下。看看是否能够解惑。

大家在看

  • 数据通信论文
  • 在西藏上大学是一种什么体验?如何解决语言问题?
  • 数据库中的事务 638
  • VINS-FUSION 优化-先验因子(边缘化)
  • #java学习笔记 1400

最新文章

  • 关于游戏软件内嵌广告的小讨论
  • 关于创业的小讨论
  • ZBrush入门使用介绍——2、GoZ使用
2024
07月 12篇
06月 16篇
05月 16篇
04月 17篇
03月 19篇
02月 5篇
01月 20篇
2023年151篇
2022年1篇
2020年4篇
2019年5篇
2018年64篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司下拉关键词排名立荐10火星黑龙江关键词排名优化软件yandex网站排名优化谢岗网站优化服务外包广州增城关键词排名宣城网站搜索优化哪家正规直通车关键词移动排名无展现深圳怎样做好网站优化计划贵州福州网站优化泰安关键词排名首页灰色关键词排名接单宣城企业网站优化广州正规SEO网站优化公司秦皇岛关键词排名优化技巧上高网站优化推广小谈网站关键词优化网站上图片怎么优化威海加盟网站优化朔州百度关键词排名优化浙江谷歌网站seo优化大兴网站建设和优化五里店网站推广优化建设网站优化哪个好公司网站诊断与优化意义滦县靠谱的网站优化有哪些郴州小型网站建设优化华容区网站关键词排名优化价格电工电气关键词排名方案垃圾关键词做排名通州网站优化网站优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化