让树叶摇动起来

2023-10-29

Shader "XW/Tree/TreeLeaf_Simple"

{

    Properties

    {

        _Color("Main Color", Color) = (1,1,1,1)

        _clipAlpha("clip Alpha", Range(0 , 1) ) = 0.5

        _MainTex("Base (RGB) Trans (A)", 2D) = "white" {}

        _Cutoff("Alpha Cutoff", Range(0,1)) = 0.333

        _Strength("摇摆幅度", Float) = 1

        _Speed("摇摆速度", Float) = 3

        _AoColor("漫反射堆叠色", Color) = (1,1,1)

        _Specular("高光色", Color) = (1,1,1)

        _Gloss("光泽度", Float) = 1

    }


 

    SubShader

    {

        Tags

        {

            "Queue" = "AlphaTest"

            "IgnoreProjector" = "True"

            "RenderType" = "TransparentCutout"

        }

        LOD 250

        Cull Off

        Pass

        {

            CGPROGRAM

            #include "../CGIncludes/UnityCG.cginc"

            #include "../CGIncludes/UnityLightingCommon.cginc"

            // #pragma alphatest:_Cutoff noforwardadd   // #pragma surface surf Lambert

            ///*nodirlightmap nodynlightmap noforwardadd*/

            #pragma target 2.0

            #pragma vertex vert

            #pragma fragment frag alphatest:_Cutoff noforwardadd


 

            fixed4 _Color;

            float _clipAlpha;

            sampler2D _MainTex;

            float4 _MainTex_ST;

            fixed3 _AoColor;

            float _Speed;

            float _Strength;

           

            fixed3 _Specular;

            float _Gloss;

            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;

            };

            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.texcoord , _MainTex );

                // o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;

                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 texture

                fixed4 col = tex2D( _MainTex, i.uv );

                // 丢弃掉小于 0 的像素

                clip ( col.a - _clipAlpha );

                // 世界空间下的法线

                fixed3 worldNormal = i.worldNormal;

                // 世界空间下光源方向

                fixed3 worldLightDir = normalize( _WorldSpaceLightPos0.xyz );

                // 漫反射

                fixed3 diffuse = _LightColor0.rgb * col.rgb * _AoColor * (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, col.a );

                return fixed4( diffuse + ambient + specular, col.a );

            };

            // void surf(Input IN, inout SurfaceOutput OUT)

            // {

            //  fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;

            //  OUT.Albedo = c.rgb;

            //  OUT.Alpha = c.a;

            // }            

            ENDCG

        } // end Pass

    } // end SubShader


 

    FallBack "XW/Mobile/Cutout/VertexLit"

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让树叶摇动起来 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户

随机推荐

  • linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递

    0 说明 本学习系列代码几乎完全摘自 asmtutor com 如果英文可以的 也可以用谷歌浏览器翻译看 可以直接看asmtutor com上的教程 系统环境搭建 我用的是ubuntu18 04 4 server 安装gcc g sudo
  • unix环境高级编程 /ls的实现,以及目录这种文件等

    ls的思路 a gt 目录 b gt 文件名 想要获取某目录下 比如a目下 b文件的详细信息 我们应该怎样做 1 首先 我们使用opendir函数打开目录a 返回指向目录a的DIR结构体c 指向 目录a 的 DIR结构体指针c opendi
  • 全球及中国高端装备制造产业销售前景及投资战略规划研究报告2021-2027年版

    全球及中国高端装备制造产业销售前景及投资战略规划研究报告2021 2027年版 HS HS HS HS HS HS HS HS HS HS HS HS HS HS 修订日期 2021年10月 搜索鸿晟信合研究院查看官网更多内容 第一章 高端
  • 做网络赚钱成功的诀窍

    作者 芊蓝小编 日期 2010年07月30日 来源 互联网 1 不要把网络看得多么深奥难懂 它只是你挣钱的一个工具而已 2 问10个人 不如你自己动脑和手真正解析一件事情 3 不要试图掌握网络上的每个知识 谁都不可能学得完 学会跟你工作最相
  • 2012网易校园招聘杭州站笔试

    恩 今天去参加了网易的笔试 题目随后更新 1 长度为M字符串匹配与长度为N的字符串匹配的时间复杂度 我查了查 O M N KMP能做到 这里 http blog csdn net meixr article details 6456896
  • 基于react+springboot校园管理平台的设计与实现

    一 项目介绍 随着信息科学技术的不断发展 很多高校 中学甚至小学都配备了一套管理系统来有效便捷的进行校园管理 学生信息管理 会议管理等 这些系统极大的提高了学校教学的效率与质量 满足了学校对信息管理的要求 但是 在实际应用过程中 这些管理系
  • Python自动化,模糊匹配助力自动答题,准确率高达100%

    前两天的一篇文章给大家分享了利用 Selenium 自动刷课的脚本 时光飞逝 挂脚本刷完时长 又到了要考试的日子 对于这种 无关紧要 的考试 我打算继续使用 聪明 的自动化工具帮我完成考试 爬取题库 想要完成作答 免不了需要题库的支撑 考试
  • 基于opencv与mediapipe手势关键点检测,并使用KNN近邻算法手势识别(石头、剪刀、布)的python代码实现

    本文主要利用opencv读取摄像头的手势画面数据 利用mediapipe库提供的方法将手势图像画面转化为手部21个关节点的坐标值 通过坐标值的数理关系进行任意手势的识别 通过mediapipe拿到21个手势关节点坐标后 对任意手势识别的方法
  • Excel VBA应用:单元格的字母自动大写转换等操作

    Private Sub Worksheet SelectionChange ByVal Target As Range 所有单元格进行字母大写转换 Application EnableEvents False Target VBA UCas
  • hc-05 模块教程2 (两个hc-05连接)

    http www arduino cn thread 21735 1 1 html 最近在做项目需要建立两个hc 05通讯 但网上教程有限和有很多都不是很清楚所以整合了下资料重新做了一份个人认为比较详细的教程和大家一起分享学习 这个教程说明
  • 给github项目贡献代码详细步骤

    本文以 dlink 项目为例 1 fork 第一步是打开 github 上的项目地址 然后点击页面右上角的 fork 按钮 将项目 fork 到自己账号的仓库 记得登录自己的 github 账号 具体看下面图示 这个页面 不需要修改什么参数
  • PHP 常用的设计模式跟使用场景

    策略模式 把类中可能改变的方法用成员属性替换 属性是实现对应方法接口的类 本来直接调用类方法 修改后就是调用成员属性类的方法 这样可以在运行时给类设置不同的成员属性达到动态改变调用的方法 使用 Model 类 持有 Query 类 通过调用
  • Android 项目调用第三方库so动态库

    在Android NDK开发中 可以通过自己编写C C 代码来构建so动态库进行调用之外 还可以把so动态库提供给第三方使用 接下来 我将介绍在新创建的Android 项目 或已存在的Android 项目 中如何调用第三方so动态库 关于如
  • ChatGPT的原理与前端领域实践

    一 ChatGPT 简介 ChatGPT的火爆 ChatGPT作为一个web应用 自22年12月发布 仅仅不到3个月的时间 月活用户就累积到1亿 在此之前 最快记录的保持者也需要9个月才达到月活1亿 ChatGPT的反爬 https cha
  • 02-react组件基础-函数组件-类组件(有状态和无状态组件)-事件处理(this指向)-setState修改状态-表单处理(受控组件和非受控组件)-案例

    学习目标 能够使用函数创建组件 函数组件 能够掌握class语法 extends继承 能够使用class创建组件 类组件 能够给React元素绑定事件 能够使用state与setState 能够处理事件中this的指向问题 能够使用受控组件
  • mysql,oracle,sqlserver之表备份

    mysql表备份 1 只复制表结构到新表 只有结构无数据 create table 新表 select from 旧表 where1 2 或create table 新表 like 旧表 此两种方法的区别 使用第一条语句 备份的新表并没有旧
  • C++之共享智能指针shared_ptr的实现

    目录 概念 使用标准库共享智能指针 共享智能指针底层实现 概念 共享指针是可以 由多个栈上智能指针对象 同时托管同一堆上资源的 因为shared ptr的内部实现引用计数来管理有多少智能指针指向了这块堆上资源 当一个共享智能指针出栈时 引用
  • 人脸建模1

    宝宝 把眼睛球体控制器和簇点的translate属性关联之后 选中眼睛一圈隔一个选一个面 给上nhair毛囊 删除结算器等 只留图中鼠标所在位置 毛囊分别对对应位置控制器父子约束 所有控制器做好之后一定要冻结 舌头控制器前面的组p给后面的盒
  • 二、C++语言进阶:动态库与静态库之函数篇

    2 动态库与静态库之函数篇 作用 分离编译 代码重用 分类 分类 作用 后缀 静态库 一个或多个 o目标文件归档在一个文件中 a 共享库 没有main函数的可执行文件 so 动态加载库 没有main函数的可执行文件 接口复合API so 2
  • 让树叶摇动起来

    Shader XW Tree TreeLeaf Simple Properties Color Main Color Color 1 1 1 1 clipAlpha clip Alpha Range 0 1 0 5 MainTex Base