【Unity】URP管线Shader编程实例详解 (1) : 漩涡效果shader

作者说

  1. 本系列教程适用于有编程基础和图形学基础知识的读者.
  2. 如果对您有所帮助,请点个免费的赞和关注,您的支持就是我更新最大的动力!
  3. 如果你有任何想看的内容欢迎评论区留言!
  4. 本系列教程Github : https://github.com/Sky0Master/Unity-URP-Shader-Tutorial

效果预览

Before
在这里插入图片描述


准备工作

在Unity Assets文件夹里右键新建一个Unlit Shader
在这里插入图片描述

命名之后,再右键这个shader,create -> material
在这里插入图片描述
接着随便把这个材质应用到一个Renderer上就行,我这里应用到了一个Sprite Renderer上


动手写代码!

现在我们来实现一个对纹理施加漩涡效果的shader,其实这个效果的原理就是在fragment着色器中对uv坐标进行绕中心旋转的变换,使用变换后的uv坐标去采样。(如果对【采样】和【uv坐标】的概念比较熟悉的话应该能理解
每一行代码我都进行了详细的注释,如果对其中有任何不明白的地方请在评论区留言,我会据此对注释进行补充,感谢!

Shader "Unlit/SwirlEffect"
{Properties {_MainTex ("Base Texture", 2D) = "white" {}    // 基础纹理输入,用于最终颜色输出_Angle ("Rotation Angle", Range(0,10)) = 2    // 控制旋转强度的参数, Range(0,10)限制调节范围避免过度扭曲_Radius ("Effect Radius", Range(0,1)) = 0.5   // 效果作用半径,控制漩涡中心到边缘的衰减范围}SubShader{Tags { "RenderType"="Transparent" //着色器替换标签,这个部分建议参考https://docs.unity3d.com/cn/current/Manual/SL-ShaderReplacement.html"Queue"="Transparent"	//设置渲染队列为透明层级"RenderPipeline"="UniversalPipeline"  //声明使用的渲染管线}Pass{Blend SrcAlpha OneMinusSrcAlpha // 使用标准透明度混合 读者可以尝试注释掉这行会发生什么HLSLPROGRAM //使用URP标准的HLSL语法#pragma vertex vert // 声明顶点着色器#pragma fragment frag  // 声明片段着色器//#pragma multi_compile_fog //开启雾效支持//URP专用#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"struct Attributes { //输入数据结构 (URP命名规范)float4 positionOS : POSITION; //物体空间的顶点坐标float2 uv : TEXCOORD0;  //初始纹理坐标};struct Varyings {   //输出数据结构 (URP命名规范)float4 positionCS : SV_POSITION; //裁剪空间坐标(SV_前缀)float2 uv : TEXCOORD0;  //传递纹理坐标};TEXTURE2D(_MainTex);    //在HLSL中,TEXTURE2D是一个宏,用于声明纹理资源, 这行代码告诉Shader存在一个名为_MainTex的2D纹理,供后续采样使用SAMPLER(sampler_MainTex); //SAMPLER宏声明采样器状态,与纹理绑定。URP中,纹理和采样器通常是分开的,这样可以更灵活地重用采样器设置float _Angle;   //自定义的属性,在Properties块中声明后,需要在HLSL代码中再次声明,以便在着色器中使用. 这样可以在Properties和HLSL中同步变量,确保参数传递正确float _Radius;Varyings vert(Attributes IN) {Varyings OUT;OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz); // URP坐标变换OUT.uv = IN.uv;   // 直接传递UVreturn OUT;}half4 frag(Varyings IN) : SV_Target {// 计算中心偏移float2 centerOffset = IN.uv - float2(0.5,0.5);float distance = length(centerOffset);// 动态旋转计算float rotation = _Angle * saturate(1 - distance/_Radius); //基于自定义半径的衰减计算float sinRot, cosRot;   sincos(rotation, sinRot, cosRot); //性能优化,同时计算旋转角度的sin和cos而不是分开计算// UV变换矩阵float2x2 rotMatrix = float2x2(cosRot, -sinRot, sinRot, cosRot); //旋转矩阵构造float2 distortedUV = mul(rotMatrix, centerOffset) + 0.5;    //应用矩阵变换// 采样纹理half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, distortedUV); //使用变换后的uv坐标去采样纹理// 边缘淡化float fade = smoothstep(_Radius, _Radius * 0.8, distance); //边缘过渡优化return half4(color.rgb, color.a * fade);    //透明度混合}ENDHLSL}}
}

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

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

相关文章

如何安装vm 和centos

安装 VMware Workstation(以 Windows 系统为例) 1. 下载 VMware Workstation 打开 VMware 官方网站(Desktop Hypervisor Solutions | VMware ),在页面中选择适合你系统的版本进行下载。如果你是个人非商业使用&#x…

STM32-心知天气项目

一、项目需求 使用 ESP8266 通过 HTTP 获取天气数据(心知天气),并显示在 OLED 屏幕上。 按键 1 :循环切换今天 / 明天 / 后天天气数据; 按键 2 :更新天气。 二、项目框图 三、cjson作用 https://gi…

Wireshark简单教程

1.打开Wireshark,点击最上面栏目里面的“捕获”中的“选项” 2.进入网卡选择界面,选择需要捕获的选择,这里我选择WLAN 3.双击捕获选择出现下面界面 4.点击如下图红方框即可停止捕获 5.点击下图放大镜可以进行放大 6.你也可以查询tcp报文如下图

【Http和Https区别】

概念: 一、Http协议 HTTP(超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议,主要用于Web浏览器和服务器之间的通信。http也是客户端和服务器之间请求与响应的标准协议,客户端通常…

Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果

目录 一、基本的后处理流程 - 以将画面转化为灰度图为例 1. C#调用shader 2. Shader实现效果 二、Bloom辉光效果 1. 主要变量 2. Shader效果 (1)提取较亮区域 - pass1 (2)高斯模糊 - pass2&3 (3&#xff…

【R语言】dplyr包经典函数summarise函数

dplyr包经典函数summarise函数,后面改名乘reframe函数了,但是summarise仍然适用 这个函数的返回结果是一个新的数据框,下面讲一下几种常见用法 示例数据为R自带的数据集mtcars 1.不分组 mtcars %>%summarise(mean mean(disp), n n()…

使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器

随着deepseek,chatgpt等大模型的能力越来越强大,本文将介绍借助deepseek,chatgpt等大模型工具,通过编写提示词,辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多,流量分析的需求多种多样,…

vscode设置自动换行

vscode设置自动换行 方法 方法 点击文件->首选项->设置。搜索word wrap -> 选择 on 。 搜索Word Wrap,并把选项改为on。

QT 中的元对象系统(一):元对象和元数据

目录 1.为什么需要元系统 2.元数据 3.模拟元对象系统 3.1.元对象声明 3.2.对C扩展 3.3初始化元对象 3.4.使用元对象 4.QT的元系统 4.1.元对象系统基于QObject类、Q_OBJECT宏、元对象编译器MOC实现 4.2.元对象系统的功能 4.3.Q_PROPERTY()的使用 4.4.Q_INVOKABLE使用…

Pytorch实现之浑浊水下图像增强

简介 简介:这也是一篇非常适合GAN小白们上手的架构文章!提出了一种基于GAN的水下图像增强网络。这种网络与其他架构类似,生成器是卷积+激活函数+归一化+残差结构的组成,鉴别器是卷积+激活函数+归一化以及全连接层。损失函数是常用的均方误差、感知损失和对抗损失三部分。 …

TCPDF 任意文件读取漏洞:隐藏在 PDF 生成背后的危险

在网络安全的世界里,漏洞就像隐藏在黑暗中的“定时炸弹”,稍有不慎就会引发灾难性的后果。今天,我们要聊的是一个与 PDF 生成相关的漏洞——TCPDF 任意文件读取漏洞。这个漏洞可能让攻击者轻松读取服务器上的敏感文件,甚至获取整个…

【Git】六、企业级开发模型

文章目录 Ⅰ. 前言Ⅱ. 系统开发环境Ⅲ. Git 分支设计规范master分支release分支develop分支feature分支hotfix分支 Ⅰ. 前言 ​ 我们知道,一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护。 ​…

Kafka可视化工具EFAK(Kafka-eagle)安装部署

Kafka Eagle是什么? Kafka Eagle是一款用于监控和管理Apache Kafka的开源系统,它提供了完善的管理页面,例如Broker详情、性能指标趋势、Topic集合、消费者信息等。 源代码地址:https://github.com/smartloli/kafka-eagle 前置条件…

C++:dfs,bfs各两则

1.木棒 167. 木棒 - AcWing题库 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过 5050 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序…

电子商务网站租用香港服务器的好处有哪些?

电子商务网站租用香港服务器的好处主要包括: 香港服务器提供高速的网络连接,国内访问速度优势明显,满足企业内部数据传输和远程办公需求。拥有国际出口带宽优势,实现与全球各地的高速连接,对跨国业务和海外市场拓展至关…

stm32108键C-B全调性_动态可视化乐谱钢琴

108键全调性钢琴 一 基本介绍1 项目简介2 实现方式3 项目构成 二 实现过程0 前置基本外设驱动1 声音控制2 乐谱录入&基础乐理3 点阵屏谱点动态刷新4 项目交互控制5 录入新曲子过程 三 展示,与链接视频地址1 主要功能函数一览2 下载链接3 视频效果 一 基本介绍 …

【p-camera-h5】 一款开箱即用的H5相机插件,支持拍照、录像、动态水印与样式高度定制化。

【开源推荐】p-camera-h5:一款轻量级H5相机插件开发实践 一、插件背景 在Web开发中,原生摄像头功能的集成往往面临以下痛点: 浏览器兼容性问题视频流与水印叠加实现复杂移动端适配困难功能定制成本高 为此,p-camera-h5 —— 一…

交叉编译curl(OpenSSL)移植ARM详细步骤

运行配置脚本 使用 Configure 脚本配置 OpenSSL,指定目标平台和安装路径: curl downloads 各个版本 Old 1.1.1 Releases | OpenSSL Library 各个版本 从 OpenSSL 官网下载源码包 tar -xzf openssl-1.1.1b.tar.gz cd openssl-1.1.1b/运行配置脚本 使…

大语言模型中的 Token如何理解?

在大语言模型中,Token 是文本处理的基本单元,类似于“文字块”,模型通过将文本分割成Token来理解和生成内容。举一个形象一点的例子,可以理解为 AI 处理文字时的“最小积木块”。就像搭乐高时,每块积木是基础单位一样&…

表单制作代码,登录动画背景前端模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。一个炫酷的按钮特效不仅能提升用户体验,还能为网页增添独特的视觉吸引力。今天,我们将通过CSS来实现一个“表单制作代码,登录动画背景前端模板”。该素材呈现了数据符号排版显示出人形的动画效果,新颖有…