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)是网络传输数据的协议,负责在网络中唯一标识和定位设备,并提供数据传输的基础。功能: 允许计算机在网络上相互通信和交换…

C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别?前置声明

现有两个文件Test.h 和Test.cpp #include 在Test.h中包含 和在Test.cpp中包含有什么区别? 1、在cpp文件中包含.h文件,要么你要用到这个头文件中的函数或者类,要么就是实现这个头文件; 2、.h —就是为了放一堆声明所产生的东西。 如果是定义…

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…

基本数据类型与 字符串相加的 知识点

在Java中,基本数据类型和字符串的相加操作会触发字符串连接(concatenation)操作。这是因为Java中的字符串是不可变的,即一旦创建,就不能修改。因此,当你将一个基本数据类型的值与字符串相加时,J…

系统学习Python——装饰器:基础知识-[函数装饰器:使用方法]

分类目录:《系统学习Python》总目录 函数装饰器已经从Python2.4开始可用。正如我们在前文所见到的,它们大体上是一种语法糖:在def语句结束时通过另一个函数来运行这个函数,把最初的函数名重新绑定到返回的结果。 函数装饰器是一种…

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

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

js对象转换为excel,excel转换为js对象

文章目录 前言js转excelexcel转js对象总结 前言 使用module.exports导出,require导入 修改后缀为mjs,可使用importd导入 ,export default \export导出(自用过一次,后面忘记怎么改的了) js转excel 需要安装nodejs node …

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

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

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

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

pip install xxx时候遇到Read timed out的问题

我们在安装一些包的时候,比如TensorFlow等等,如果直接使用: pip install tensorflow 这句命令来进行安装的时候,我们会发现此时安装的速度不仅非常慢,而且还有可能出现网络超时的情况,比如如下问题: Trac…

手撕HashMap源码2

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