2

我在 VR 领域工作,投影屏幕的良好校准非常重要,并且由于难以调整天花板安装和其他硬件特性,我正在寻找一种全屏着色器方法来“校正”屏幕的形状。

大多数 2D 或 3D 引擎允许通过在可以自定义方式变形或渲染的四边形上重绘渲染结果来应用全屏效果或变形。

第一个想法是使用顶点着色器来偏移这个屏幕四边形的角,因此图像被变形为四边形(就像投影仪上的硬件梯形失真),但这不足以满足要求(这种方法是在math.stackexchange上用现场小提琴演示进行了描述)。

在我的目标情况下:

  • 图像变形在大多数情况下必须是非线性的,因此需要 9 或 16 个控制点才能进行更精细的调整。
  • 图像的边界不是直的(桶或枕头效应),因此即使控制点很少,图像也必须在两者之间以弯曲的方式扭曲。否则,变形将在每个控制点的限制之间形成可见的线性接缝。理想情况下,知道 3x3 或 4x4 网格的每个控制点的校正位置,方法是为在全屏四边形上绘制的图像的纹理坐标定义连续变换:

u,v => 更正_u, 更正_v

你可以在这里找到一个插图。

  • 我见过一些在 2D 或 3D 中工作的 FFD 算法,它可以让图像或网格像橡胶一样“软”变形,但对于实时着色器来说,实现似乎很繁重
  • 我还想到了一个基于权重的变形,就像我们在 squeletal/soft-body 动画中所做的那样,但似乎不确定是否正确地加权控制点。你知道可以帮助我解决问题的方法、算法或一般方法吗?
  • 我看到了一些基于网格的变形,比如新的 Oculus Rift DK2 需要它自己的变形,但是大多数 2D/3D 引擎在标准中只使用由 4 个顶点组成的单个四边形。
4

2 回答 2

0

继续我的研究,我找到了一种方法。我创建了一个对应于“斜坡”或余弦值的一维 RGB 纹理。这将是 0..1 轴上偏移参数的 3 个影响系数,在 0、0.5 和 1 处有 3 个系数:

  • 红色在 x=0 处从 1 开始,在 x=.5 处下降到 0
  • 绿色在 x=0 处从 0 开始,在 x=0.5 处变为 1,在 x=1 处返回到 0
  • 蓝色在 x=0.1 处从 0 开始,在 x=1 处上升到 1

有了这些,我可以从 9 个 float2 制服中非常柔和地在图像上插入我的参数(水平查找 3 个,垂直查找最后一个)。

然后,一个插值,我用这些偏移纹理坐标,它可以工作:-D 这或多或少是使用纹理查找加速坐标的加权插值。

于 2014-09-03T08:29:52.227 回答
0

如果您需要非线性变形,贝塞尔曲面非常方便且易于实现。

您可以在 CPU 中预先构建它们,也可以使用硬件镶嵌(此处提供的示例)

于 2014-09-08T17:25:26.890 回答