【发布时间】:2014-10-26 17:11:23
【问题描述】:
我在 VR 领域工作,其中投影屏幕的良好校准非常重要,并且由于难以调整吊装和其他硬件特性,我正在寻找一种全屏着色器方法来“纠正”投影的形状屏幕。
大多数 2D 或 3D 引擎允许通过在可以以自定义方式变形或渲染的四边形上重绘渲染结果来应用全屏效果或变形。
第一个想法是使用顶点着色器来偏移这个屏幕四边形的角,因此图像被变形为四边形(就像投影仪上的硬件梯形失真),但这不足以满足要求 (此方法在math.stackexchange 上进行了描述,并带有现场小提琴演示)。
在我的目标情况下:
- 图像变形在大多数情况下必须是非线性的,因此需要 9 或 16 个控制点才能进行更精细的调整。
- 图像的边界不是直的(桶或枕头效应),因此即使控制点很少,图像也必须在其间以弯曲的方式扭曲。否则,变形会在每个控制点的限制之间形成可见的线性接缝。 理想情况下,知道 3x3 或 4x4 网格的每个控制点的校正位置,方法是为在全屏上绘制的图像的纹理坐标定义连续变换 四边形:
u,v => 更正的_u, 更正的_v
您可以找到插图here。
- 我见过一些在 2D 或 3D 中工作的 FFD 算法,它可以让图像或网格像橡胶一样“柔和”变形,但 the implementation seems heavy for a real-time shader。
- 我还想到了一种基于权重的变形,就像我们在 squeletal/soft-body 动画中所做的那样,但似乎不确定是否正确地对控制点进行加权。 您知道可以帮助我解决问题的方法、算法或通用方法吗?
- 我看到了一些基于网格的变形,比如新的 Oculus Rift DK2 需要自己的变形,但大多数 2D/3D 引擎在标准情况下仅使用由 4 个顶点组成的单个四边形。
【问题讨论】:
标签: glsl hlsl fragment-shader virtual-reality