我在 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 个顶点组成的单个四边形。