【问题标题】:Method to fix the video-projector deformation with GLSL/HLSL full-screen shader使用 GLSL/HLSL 全屏着色器修复视频投影仪变形的方法
【发布时间】: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


    【解决方案1】:

    如果您需要非线性变形,Bezier Surfaces 非常方便且易于实现。

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

    【讨论】:

    • 感谢您的意见。事实上,我使用这些方程来插入我正在使用的偏移量。在大多数情况下,余弦插值不是我需要的。我使用了贝塞尔曲线的二次因子 (vec4((1.0-x)*(1.0-x), (x)*(1.0-x), (x*x), 1.0)) 并将它们与对应的键值相乘“0.0”、“0.5”和“1.0”控制值。相当不错:)
    【解决方案2】:

    继续我的研究,我找到了一种方法。 我创建了一个对应于“斜坡”或余弦值的一维 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 这或多或少是使用纹理查找来加速坐标的加权插值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2011-09-25
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多