欢迎光临散文网 会员登陆 & 注册

URP | Shader实现弯曲效果

2022-06-17 22:12 作者:那个人真狗  | 我要投稿


目的

  • 实现场景弯曲球体效果

  • 增加宏控制是否开启弯曲。

  • 自定义函数库,调用函数库

  • 学习脚本控制材质属性

思路

  • 获取模型的世界空间位置信息,顶点世界位置信息和摄像机位置相减,计算出一个XYZ的3维向量。

  • 根据这个XYZ的方向乘偏移系数。计算出的结果偏移 Y轴,

  • 目前计算都是在世界空间下完成,我们需要转换到模型空间对顶点位置进行修改。

弯曲实现

  • 我们需要获取那些熟悉信息

    • 顶点世界空间的位置信息

    • 摄像机的位置信息

准备数据

  • 顶点2个变量控制X还Z的弯曲数值。

  • 在顶点着色器阶段 获取顶点世界位置信息和摄像机位置

注意:这里只是示例Shader 没有输出到片元着色器阶段,如果需要可以输出到片元着色器阶段。

  • 增加弯曲系数

这里是俩个 方向,一个是X方向, 一个是Z方向。

  • 创建一个三维向量,修改这个三维向量的Y轴。

这里世界顶点位置加我们刚刚计算出的结果。

  • 现在是在世界空间,我们需要转换到模型空间

  • 传入顶点位置信息,输出到渲染屏幕

效果

  • 顶点效果就出现了

设置关键字

目前效果实现了,我们需要一个开关,控制是否开启。

定义纹理

  • 增加关键字

  • 顶点结构体 增加判断

这里一个是默认的顶点转换到屏幕空间。  一个是顶点动画计算完在转换到屏幕空间。

  • 效果

  • 全代码

函数库的使用方法

  • 创建一个文件,改成hlsl文件格式。

  • 在文件里增加库语法

  • 定义一个函数,我们原来的顶点计算放到函数里

  • TransformWorldToHClip    这里我们看到计算需要输入顶点位置信息,以及控制弯曲的X,Z的数值。

注意:这里输出的是float4类型。

  • 在回到Shader里,导入刚刚定义的库。

  • 使用函数替换 原来的代码

注意:下面这个就是我们刚刚自定义的函数。

源代码

  • hlsl文件



  • Shader



C# 脚本控制Shader属性

  • 这里使用动画曲线控制切换的属性,一开是是一个平面变成带有弧度的半球体

创建一个C# 脚本,AnimationCurveTest

创建 几个变量,外部控制,使用Update函数 设置材质属性。

  • 效果

扩展 在C#中怎么获取Shader里的材质属性?

第一种获取材质球属性

  • 最简单的一种获取材质的方法

  • 效果

这样就需要把材质拖到脚本里,这有一个缺点,每次都需要拖入。

第二种获取材质球方法

  • 变量不暴露出去,

扩展 还可以获取多个材质?

Material[] m_arr_material = GetComponent<Renderer>().materials;

调整曲线实现切换效果

  • 设置好曲线数值,效果

总结

  • 根据摄像机计算模型顶点动画,

  • 使用关键字控制开启关闭弯曲变形。

  • C#脚本控制材质属性的方法

  • 使用函数库的方法定义函数,这样干净简单,后期好维护。


URP | Shader实现弯曲效果的评论 (共 条)

分享到微博请遵守国家法律