在下面的图片中,我模拟了我要完成的工作-尝试将像素向AR标记的中心方向挤压,这样当我覆盖AR内容时,AR标记就不太明显了。
我正在寻找一些我可以参考的示例或教程,以开始学习如何创建用于使纹理变形的着色器,但我一无所获。
完成此操作的最佳方法是什么?
答案 0 :(得分:1)
这可以使用GrabPass来实现。
从手册:
GrabPass是一种特殊的传递类型-它捕获要将对象绘制到纹理中的屏幕内容。此纹理可以在后续遍中使用,以执行基于图像的高级效果。
基本上,失真效果的工作方式是在网格顶部渲染GrabPass纹理的内容,但UV会扭曲。进行此操作的常用方法(针对热变形或冲击波等效果)是渲染带有法线贴图的广告牌平面,该法线贴图控制背景样本的UV扭曲了多少。这是通过将法线从世界空间转换为屏幕空间,将其乘以强度值并将其应用于UV来实现的。这样的着色器here就是一个很好的例子。从技术上讲,您也可以使用任何网格,并以类似方式将其顶点法线用于位移。
除法线贴图平面外,另一种实现此效果的方法是使用Shader.SetGlobalVector将跟踪器的屏幕空间位置传递到着色器中。然后,在着色器内部,您可以计算片段和对象之间的向量,并使用该向量偏移UV,可能使用一些重新映射功能(如平方距离)。例如,您可以使用float2 uv_displace = normalize(delta) * saturate(1 - length(delta))
。
如果要精确控制应用此效果的方式和时间,请进行设置,以将ZTest和ZWrite设置为Off,然后将渲染队列设置为在背景之后但在跟踪器之前。
对于AR应用程序,可以通过使用相机背景纹理而不是GrabPass纹理来避免使用GrabPass带来的性能开销。您可以尝试查看相机背景脚本的内部内容,以查看它如何通过相机纹理传递到着色器,并尝试复制它。
这里有两个视频演示了GrabPass的工作原理: