Unity中URP下的顶点偏移

文章目录

  • 前言
  • 一、实现思路
  • 二、实现URP下的顶点偏移
    • 1、在顶点着色器中使用正弦函数,实现左右摇摆的效果
    • 2、在正弦函数的传入参数中,加入一个扰度值,实现不规则的顶点偏移
    • 3、修改正弦函数的振幅 A,让我们的偏移程度合适
    • 4、修改正弦函数的 ω 来调节周期,调节偏移频率
    • 5、对其 x 也做同样的偏移(该效果根据个人喜好添加)
    • 6、在属性面板定义一个四维变量 用来控制 正弦的振幅 和 周期
  • 三、测试代码


前言

在上篇文章中,我们实现了URP下的半透明效果。

  • Unity中URP下的半透明效果实现

在这篇文章中,我们实现一下像鬼魂一样的顶点偏移效果。


一、实现思路

在顶点着色器中,对模型本地空间坐标在转化成齐次裁剪坐标前,进行赋值修改

  • y = A sin(ωx + φ) + B

二、实现URP下的顶点偏移

1、在顶点着色器中使用正弦函数,实现左右摇摆的效果

v.vertexOS.z += sin(_Time.y);

请添加图片描述

2、在正弦函数的传入参数中,加入一个扰度值,实现不规则的顶点偏移

这里用模型顶点本地空间下的 y 值 作为扰度值

v.vertexOS.z += sin(_Time.y + v.vertexOS.y);

请添加图片描述

3、修改正弦函数的振幅 A,让我们的偏移程度合适

  • 在图形计算器中,看一下效果
    请添加图片描述

v.vertexOS.z += 0.3 * sin(_Time.y + v.vertexOS.y);

请添加图片描述

4、修改正弦函数的 ω 来调节周期,调节偏移频率

  • 在图形计算器中,看一下效果
    请添加图片描述

v.vertexOS.z += 0.3 * sin((_Time.y + v.vertexOS.y)*6);

请添加图片描述

5、对其 x 也做同样的偏移(该效果根据个人喜好添加)

v.vertexOS.x += 0.3 * sin((_Time.y + v.vertexOS.y)*6);

请添加图片描述

6、在属性面板定义一个四维变量 用来控制 正弦的振幅 和 周期

_Animation(“Repeat(XY) Intensity(ZW)”,Vector) = (0,0,0,0)

  • 在顶点着色器中

v.vertexOS.z += _Animation.z * sin((_Time.y + v.vertexOS.y)_Animation.x);
v.vertexOS.x += _Animation.w * sin((_Time.y + v.vertexOS.y)
_Animation.y);

请添加图片描述


三、测试代码

为了同时支持 Universal Render Pipeline 和 BuildIn Render Pipeline。
需要写一个同样逻辑 BRP 下的SubShader

//URP下的菲涅尔效果
//URP下的透明效果
//URP下的顶点偏移
Shader "MyShader/URP/P3_2_5"
{Properties{_FresnelColor("FresnelColor",Color) = (0,0,0,0)_Fresnel("Fade(X) Intensity(Y) Top(Z) Offset(W)",Vector) = (4,1,1,0)_Animation("Repeat(XY) Intensity(ZW)",Vector) = (0,0,0,0)}SubShader{Tags{//告诉引擎,该Shader只用于 URP 渲染管线"RenderPipeline"="UniversalPipeline"//渲染类型"RenderType"="Transparent"//渲染队列"Queue"="Transparent"}Blend One One ZWrite OnPass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attributes{float3 vertexOS : POSITION;float3 normalOS : NORMAL;};struct Varyings{float3 vertexOS : TEXCOORD0;float4 vertexCS : SV_POSITION;float3 vertexWS : TEXCOORD1;float3 normalWS : TEXCOORD2;};CBUFFER_START(UnityPerMaterial)half4 _FresnelColor;half4 _Fresnel;float _Offset;float4 _Animation;CBUFFER_ENDVaryings vert(Attributes v){Varyings o;o.vertexOS = v.vertexOS;v.vertexOS.z += _Animation.z * sin((_Time.y + v.vertexOS.y) * _Animation.x);v.vertexOS.x += _Animation.w * sin((_Time.y + v.vertexOS.y) * _Animation.y);o.vertexWS = TransformObjectToWorld(v.vertexOS);o.vertexCS = TransformWorldToHClip(o.vertexWS);o.normalWS = TransformObjectToWorldNormal(v.normalOS);return o;}half4 frag(Varyings i) : SV_Target{//dot(N,L)half3 N = normalize(i.normalWS);half3 L = normalize(_WorldSpaceCameraPos - i.vertexWS);half NdotL = dot(N, L);//菲涅尔效果 1 - dot(N,L)half fresnel = 1 - saturate(NdotL);//菲涅尔自定义half4 fresnel1 = pow(fresnel, _Fresnel.x) * _Fresnel.y * _FresnelColor;//透明渐变效果float alphaMask = saturate(i.vertexOS.y * -1 + i.vertexOS.x * -1 + _Fresnel.w);fresnel1 = alphaMask * fresnel1;//头部菲涅尔效果和下部菲涅尔效果做出区别fresnel1 = lerp(fresnel1, _FresnelColor * alphaMask * fresnel1, alphaMask * _Fresnel.z);return fresnel1;}ENDHLSL}}SubShader{Tags{//渲染类型"RenderType"="Transparent"//渲染队列"Queue"="Transparent"}Blend One One ZWrite OnPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float3 vertexOS : POSITION;float3 normalOS : NORMAL;};struct v2f{float3 vertexOS : TEXCOORD0;float4 vertexCS : SV_POSITION;float3 vertexWS : TEXCOORD1;float3 normalWS : TEXCOORD2;};half4 _FresnelColor;half4 _Fresnel;float _Offset;float4 _Animation;v2f vert(appdata v){v2f o;o.vertexOS = v.vertexOS;v.vertexOS.z += _Animation.z * sin((_Time.y + v.vertexOS.y) * _Animation.x);v.vertexOS.x += _Animation.w * sin((_Time.y + v.vertexOS.y) * _Animation.y);o.vertexWS = mul(unity_ObjectToWorld,v.vertexOS);o.vertexCS = UnityWorldToClipPos(o.vertexWS);o.normalWS = UnityObjectToWorldNormal(v.normalOS);return o;}half4 frag(v2f i) : SV_Target{//dot(N,L)half3 N = normalize(i.normalWS);half3 L = normalize(_WorldSpaceCameraPos - i.vertexWS);half NdotL = dot(N, L);//菲涅尔效果 1 - dot(N,L)half fresnel = 1 - saturate(NdotL);//菲涅尔自定义half4 fresnel1 = pow(fresnel, _Fresnel.x) * _Fresnel.y * _FresnelColor;//透明渐变效果float alphaMask = saturate(i.vertexOS.y * -1 + i.vertexOS.x * -1 + _Fresnel.w);fresnel1 = alphaMask * fresnel1;//头部菲涅尔效果和下部菲涅尔效果做出区别fresnel1 = lerp(fresnel1, _FresnelColor * alphaMask * fresnel1, alphaMask * _Fresnel.z);return fresnel1;}ENDCG}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux/Windows IP | Team基础管理

引言 IP(Internet Protocol) 定义: IP(Internet Protocol)是网络传输数据的协议,负责在网络中唯一标识和定位设备,并提供数据传输的基础。功能: 允许计算机在网络上相互通信和交换…

VMware Ubuntu虚拟机忘记密码

​​原文 https://blog.csdn.net/ezconn/article/details/89328024​​​​​​​ 前言: 在VMware运行Ubuntu虚拟机时,开机之后忘记密码怎么办? 环境:Ubuntu版本:ubuntu-16.04.6-server-amd64;VMware版本…

乐理基础-弱起小节、弱起

弱起小节的定义: 1.音乐不是从强拍开始的,是从弱拍或次强拍开始的。 2.弱起小节会省去前面没有音乐的部分,它是不完整的小节,它的拍数是不够的。如图1 弱起小节的作用: 强拍经常要作为 和弦出现 和 变化的地方&#xf…

德人合科技 | 防止公司电脑文件数据资料外泄,自动智能透明加密保护系统

【透明加密软件】——防止公司电脑文件数据资料防止外泄,自动智能透明加密保护内部核心文件、文档、图纸、源代码、音视频等资料! PC端访问地址: www.drhchina.com 🌟 核心功能: 透明加密:采用高级加密算…

EasyExcel合并相同内容单元格及动态标题功能的实现

一、最初版本 导出的结果: 对应实体类代码: import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentLoopMerge; import com.al…

全链路压力测试:解析其主要特点

随着信息技术的飞速发展和云计算的普及,全链路压力测试作为一种关键的质量保障手段,在软件开发和系统部署中扮演着至关重要的角色。全链路压力测试以模拟真实生产环境的压力和负载,对整个业务流程进行全面测试,具有以下主要特点&a…

Nginx网站服务详解(Nginx服务的主配置文件 ——nginx.conf)

目录 一、全局配置的六个模块简介 二、Nginx配置文件的详解 1)全局配置模块 2)I/O 事件配置 3)HTTP 配置 4)web服务监听设置 5)其他设置 location常见配置指令:“root、alias、proxy_pass 对比&a…

【数据分享】2019-2023年我国地级市逐年新房房价数据(免费获取/Excel/Shp格式)

房价是一个城市发展程度的重要体现,一个城市的房价越高通常代表这个城市越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据!之前我们分享了2019—2023年我国地级市逐月的新房房价数据…

揭秘`v-if`和`v-show`的区别:选择正确指令的技巧(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

EasyExcel模板导出(行和列自动合并)

1.需求背景: ①需要从第三方获取数据,第三方接口有两个参数,开始时间和结束时间 ②获取回来的数据并没有入库,所以不能通过数据库将数据归类统计,excel合并大概的流程是判断上一行或者左右相邻列是否相同,然后进行合并,所以不能是零散的数据且客户要求每一个自治区和每一个航站…

系统分析师(软考)知识点整理(一)

第一章 信息 信息是不确定性的减少 xi: n个状态中的第i个状态p(xi):出现第i个状态的概率b: b一般取值为2 特征 #mermaid-svg-pvPkY9RE5GZIIIxl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pvPkY9RE5GZIIIxl…

一篇文章带你了解各个程序员接单平台,让你选择不再迷茫!!!

相信现在很多程序员都已经走上了或者准备走上网上接单这条路,但是目前市面上的接单平台可谓五花八门,对于各个平台的优缺点,不同的程序员该如何选择适合自己的接单平台,你又是否了解呢? 接下来就让小编用一篇文章来为…

Gemini自曝中文用百度文心一言训练,网友看呆:大公司互薅羊毛??

谷歌Gemini中文语料疑似来自文心一言??? 先是有读者向我们爆料: 在谷歌Vertex AI平台使用该模型进行中文对话时,Gemini-Pro直接表示自己是百度语言大模型。 很快,有微博大V阑夕夜也发博称: 在…

超实用的Web兼容性测试经验总结,建议Mark

在日常工作中,我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试,目的在于保证待测试项目在不同的操作系统平台上正常运行。 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行;待测试项目能与相关的其他软件或系统的“和…

手撕HashMap源码2

目录 引言 putTreeVal红黑树添加结点方法讲解 treeifyBin进行树化的方法(虚假的树化) treeify真正的树化操作 从扩容的部分来分析红黑树的代码 split红黑树扩容迁移的方法 untreeify链化(退树成链) 红黑树代码分析 rota…

FO with Prefix Hashing KEM Generalizations

参考文献: [Has88] Hastad J. Solving simultaneous modular equations of low degree[J]. siam Journal on Computing, 1988, 17(2): 336-341.[BBM00] Bellare M, Boldyreva A, Micali S. Public-key encryption in a multi-user setting: Security proofs and im…

2023 英特尔On技术创新大会直播 | AI 融合发展之旅

前言 2023 年的英特尔 On 技术创新大会中国站,主要聚焦最新一代增强 AI 能力的计算平台,深度讲解如何支持开放、多架构的软件方案,以赋能人工智能并推动其持续发展。 大会的目标之一是优化系统并赋能开发者,特别注重芯片增强技术…

国产划片机品牌众多,如何选择优质的供应商?

在半导体行业的发展浪潮中,划片机作为关键设备之一,其性能和质量对于生产过程的高效性和产品的质量具有至关重要的影响。近年来,国产划片机的品牌数量不断增多,为半导体行业提供了更多的选择。然而,如何从众多的品牌中…

【Python炫酷系列】一闪一闪亮星星,漫天都是小星星(完整代码)

文章目录 环境需求完整代码详细分析系列文章环境需求 python3.11.4及以上版本PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.…

Python 爬虫之简单的爬虫(四)

爬取动态网页(下) 文章目录 爬取动态网页(下)前言一、大致内容二、基本思路三、代码编写1.引入库2.加载网页数据3.获取并保存4.保存文档 总结 前言 上篇主要讲了如何去爬取数据,这篇来讲一下如何在获取的同时将数据整…