URP | Shader实现弯曲效果

目的
实现场景弯曲球体效果
增加宏控制是否开启弯曲。
自定义函数库,调用函数库
学习脚本控制材质属性
思路
获取模型的世界空间位置信息,顶点世界位置信息和摄像机位置相减,计算出一个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#脚本控制材质属性的方法
使用函数库的方法定义函数,这样干净简单,后期好维护。
