0

我在下图中模拟了我想要完成的任务——试图将像素捏向 AR 标记的中心,这样当我覆盖 AR 内容时,AR 标记就不那么明显了。

我正在寻找一些可以参考的示例或教程,以开始学习如何创建着色器来扭曲纹理,但我一无所获。

实现这一目标的最佳方法是什么?

在此处输入图像描述

4

1 回答 1

1

这可以使用GrabPass来实现。

从手册:

GrabPass 是一种特殊的传递类型——它在对象即将被绘制到纹理中的位置抓取屏幕内容。此纹理可用于后续通道以执行基于图像的高级效果。

扭曲效果的工作方式基本上是在网格顶部渲染 GrabPass 纹理的内容,除了其 UV 扭曲。执行此操作的常用方法(用于热变形或冲击波等效果)是渲染带有法线贴图的广告牌平面,其中法线贴图控制背景样本的 UV 扭曲程度。这是通过将法线从世界空间转换到屏幕空间,将其与强度值相乘,并将其应用于 UV 来实现的。这里有这样一个着色器的一个很好的例子。您也可以在技术上使用任何网格并以类似的方式使用其顶点法线进行置换。

除了法线映射平面之外,实现此效果的另一种方法是使用Shader.SetGlobalVector将跟踪器的屏幕空间位置传递到着色器中。然后,在着色器中,您可以计算片段和对象之间的向量,并使用它来偏移 UV,可能使用一些重映射函数(如平方距离)。例如,您可以使用float2 uv_displace = normalize(delta) * saturate(1 - length(delta)).

如果您想准确控制应用此效果的方式和时间,请将 ZTest 和 ZWrite 设置为 Off,然后将渲染队列设置为在背景之后但在跟踪器之前。

对于 AR 应用程序,可以通过使用相机背景纹理而不是 GrabPass 纹理来避免使用 GrabPass 的性能开销。您可以尝试查看您的相机背景脚本,看看它如何将相机纹理传递到着色器并尝试复制它。

这里有两个视频展示了 GrabPass 的工作原理:

https://www.youtube.com/watch?v=OgsdGhY-TWM

https://www.youtube.com/watch?v=aX7wIp-r48c

于 2019-11-28T11:16:54.533 回答