假设我有一个纹理映射到网格屏幕对齐的网格。它看起来像:
顶点位置为:
(-1, -1), (1, -1), (-1, 1), (1, 1)
紫外线:
(0, 0), (1, 0), (0, 1), (1,1)
我通过在顶点周围移动来扭曲图像并通过执行glReadPixels()
.
新的扭曲顶点位置是:
(-1, -1), (0.8, -0.8), (-0.6, 0.6), (0.4, 0.4)
产生的输出如下:
下次我使用刚刚保存的扭曲图像作为输入。我要做的是通过修改顶点坐标来反转我之前所做的翘曲效果。最初我认为解开图像的坐标必须是这样的:
x_unwarp = 2 * x_original - x_warped
但它不起作用。翘曲效果不会被撤销。我得到的是这样的:
知道我做错了什么,应该如何修改顶点坐标或 uvs?我确定我的数学错了。
谢谢!
更新
看来我的公式是错误的。我应该使用矩阵:
transform_matrix * x_original = x_warped
进而:
x_unwarped = inverse(tranform_matrix) * x_original
由于我正在做的转换是纯缩放,所以转换矩阵就像:
/ \
| S 0 |
| 0 S |
\ /
其中 S 是比例因子。因此,逆将是:
/ \
| 1/S 0 |
| 0 1/S |
\ /
因此,这将使展开的顶点位置为:
(-1, -1), (1.25, -1.25), (-1.67, 1.67), (2.5, 2.5)
看起来更直,但仍然不正确:
第二次更新
我似乎从一开始就错了。所有渲染中都有一些随机因素。我要解决这个问题,然后再试一次。
更新:UV 扭曲
这次使用 UV 翘曲完成。
使用这些 UV 扭曲:
(0.0, 0.0), (0.9, 0.0), (0.0, 0.8), (0.7, 0.7)
这产生了:
然后尝试使用倒数展开:
(0.0, 0.0), (1/0.9, 0.0), (0.0, 1/0.8), (1/0.7, 1/0.7)
看起来像:
这也没有做到。我开始担心我忽略的 1/0 案例。
完全无知。